&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されるらしい。