&tag(WPF, ControlTemplate);
*目次 [#s8cf5256]
#contents
*参考情報 [#ebd73bb8]
-[[WPF]]
-[[“見た目”を決めるコントロール・テンプレート − @IT:http://www.atmarkit.co.jp/fdotnet/vblab/uiframework_04/uiframework_04_01.html]]

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

*簡単な例 [#f17573a2]
-Button1, Button2から、TestTemplateを参照する例。背景水色に単純に文字が書き込まれた外観になる。
#pre{{
<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を使って汎用的に [#i8551da0]
-簡単な例の場合、Templateで設定した背景や文字列が描画されてしまうので汎用性がない。
-ContentやBackgroundといった属性をButtonから持ってくるためにTempalteBindingを利用する。
-{TemplateBinding Background}とすればTemplateが適用されるButtonのBackgroundが参照される。
#pre{{
        <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を使ってさらに汎用的に。 [#h3b126d0]
-ButtonのContentはTextBlock以外にもImageやPanelなどが設定できる。
-TextBlockのTextにBindingしたのではそのような要素は表示できない。
-そこでTemplate内ではContentPresenterを使う。
#pre{{
        <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