Tag: WPF ControlTemplate

目次

参考情報

役割

  • Controlの中身を描画する。例えばTemplateにnullを指定すると何も表示されなくなる。
    <Button Content="Button" Template="{x:Null}"/>
  • Templateに明示しないときもデフォルトのTemplateが設定されている。

簡単な例

  • Button1, Button2から、TestTemplateを参照する例。背景水色に単純に文字が書き込まれた外観になる。
    <StackPanel>
     <StackPanel.Resources>
        <ControlTemplate x:Key="TestTemplate"  TargetType="Button">
          <Border Background="Cyan">
            <TextBlock Text="テスト"/>
          </Border>
        </ControlTemplate>
      </StackPanel.Resources>
    
      <Button Content="Button1"
        Template="{StaticResource TestTemplate}" />
      <Button Content="Button2"
        Template="{StaticResource TestTemplate}" />
    </StackPanel>
    

TemplateBindingを使って汎用的に

  • 簡単な例の場合、Templateで設定した背景や文字列が描画されてしまうので汎用性がない。
  • ContentやBackgroundといった属性をButtonから持ってくるためにTempalteBindingを利用する。
  • {TemplateBinding Background}とすればTemplateが適用されるButtonのBackgroundが参照される。
            <StackPanel>
                <StackPanel.Resources>
                    <ControlTemplate x:Key="TestTemplate"  TargetType="Button">
                        <Border Background="{TemplateBinding Background}">
                            <TextBlock Text="{TemplateBinding Content}"/>
                        </Border>
                    </ControlTemplate>
                </StackPanel.Resources>
    
                <Button Content="Button1" Background="Cyan"
        Template="{StaticResource TestTemplate}" />
            </StackPanel>
    
  • RelativeSourceを使っても同じようなことができる。

CcontentPresenterを使ってさらに汎用的に。

  • ButtonのContentはTextBlock以外にもImageやPanelなどが設定できる。
  • TextBlockのTextにBindingしたのではそのような要素は表示できない。
  • そこでTemplate内ではContentPresenterを使う。
            <StackPanel>
                <StackPanel.Resources>
                    <ControlTemplate x:Key="TestTemplate"  TargetType="Button">
                        <Border Background="{TemplateBinding Background}">
                            <ContentPresenter Content="{TemplateBinding Content}"/>
                        </Border>
                    </ControlTemplate>
                </StackPanel.Resources>
    
                <Button Content="Button1" Background="Cyan"
        Template="{StaticResource TestTemplate}" />
            </StackPanel>
    
  • ControlTemplate内にContentPresenterが現れた場合暗黙的にContentはBindingされるらしい。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-04-13 (水) 16:47:43