C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

C#WPF、ContentPresenterの先頭一文字抽出

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■86804 / inTopicNo.1)  C#WPF、ContentPresenterの先頭一文字抽出
  
□投稿者/ かい (20回)-(2018/03/18(Sun) 13:51:36)

分類:[.NET 全般] 

お世話になっています。
環境はVisualStudio2017 C# WPFです。

掲題についてです。

-目的

Application.Resources中のContentPresenterの先頭一文字だけをサイズ変更したい。

-状況

画面毎に共通出来るデザインが存在する為、それらをApplication.Resourcesに定義しました。
ContentPresenterで引っ張ってこれる文字列の先頭一文字だけを大きくする為、
ContentPresenterにconverterを設定しようと思いました。

情報を収集しましたが、
converterを使用するにはContentPresenterのcontentにBindingを使用する他無いように見受けられました。
その為、やりたい事の実現方法を見失いました。

具体的にやりたい事をお伝えします。
まずxaml側のソースを提示します。

<Button 
	Style="{Binding Source={StaticResource IconButton}}"
	Content="TEST"
>
</Button>

次にApplication.Resourcesの定義を提示します。

<Style x:Key="IconButton" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid>
                    <TextBlock
                               Foreground="White"
                               FontSize="14"
                               >
                        <ContentPresenter/>
                    </TextBlock>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

やりたい事は、以下のイメージです。
<Style x:Key="IconButton" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid>
                    <TextBlock
                               Foreground="White"
                               FontSize="14"
                               >
			<!--ここからやりたい事のイメージ-->
			<Run fontsize = "24"><ContentPresenter Converter="FirstChar"/></Run><ContentPresenter Converter="RestChars"/>
			<!--ここまでやりたい事のイメージ-->
                    </TextBlock>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>


以上です。
実現方法について、あるいは目的へのアプローチについて、
何か意見がおありでしたらお教え下さい。



引用返信 編集キー/
■86808 / inTopicNo.2)  Re[1]: C#WPF、ContentPresenterの先頭一文字抽出
□投稿者/ Hongliang (620回)-(2018/03/19(Mon) 14:39:32)
2018/03/19(Mon) 14:39:55 編集(投稿者)
レスがつかないようなので。

一つ思いつくのは、以下のような形式です。
<ControlTemplate TargetType="Button" x:Key="Template_IconButton">
  <ControlTemplate.Resources>
    <Style TargetType="Run" x:Key="Style_FirstLetter">
      <Setter Property="FontSize" Value="24"/>
    </Style>
    <DataTemplate TargetType="{x:Type si:String}">
      <TextBlock>
        <Run Style="{StaticResource Style_FirstLetter}"
             Text="{Binding Mode=OneWay, Converter={StaticResource FirstLetterConverter}}"/><Run
             Text="{Binding Mode=OneWay, Converter={StaticResource RestLettersConverter}}"/>
      </TextBlock>
    </DataTemplate>
  </ControlTemplate.Resources>
  <ContentPresenter/>
</ControlTemplate>

Button要素のContentに直接Stringが定義されている場合のみ、
ContentPresenterはDataTemplateを適用し、それ以外はContentを通常通りに描画します
(Button要素自身の描画はなされませんが)。

このStyleおよびDataTemplateをContentTemplateの外に出し、DataTemplateに適切なx:Keyを与えれば、
任意の「Contentに直接文字列を持つContentControl」に表示される文字列に
Style_FirstLetterが適用されるようにもできます。

引用返信 編集キー/
■86809 / inTopicNo.3)  Re[2]: C#WPF、ContentPresenterの先頭一文字抽出
□投稿者/ かい (21回)-(2018/03/20(Tue) 00:10:25)

提示して頂き、ありがとうございます。
テスト中ですが、想定通りの挙動です。うまくいきそうです。

ありがとうございました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ