728x90
WPF Style을 이용하여 여러개의 TargetType 에 대해서 각각의 ControlTemplate를 지정하는 방법이다.
Style을 Control 에 지정하였을 때, Resource는 Target이 되는 Type별로 ControlTemplate을 정의한다.
Style의 Template property 에는 style이 적용되는 control 의 TargetType 속성을 얻어와 Style.Resource 에서 매치되는 TargetType의 ControlTemplate를 적용할 수 있도록 한다.
이를 위해서 RelativeSource 의 Self 객체의 Path=TargetType 으로 값을 얻어와서 ControlTemplate의 TargetType에 binding 한다.
<Window.Resources>
<Style TargetType="Control">
<Style.Resources>
<ControlTemplate x:Key="ButtonTemplate" TargetType="Button">
<!-- Button template code here -->
</ControlTemplate>
<ControlTemplate x:Key="ComboBoxTemplate" TargetType="ComboBox">
<!-- ComboBox template code here -->
</ControlTemplate>
<ControlTemplate x:Key="ListBoxTemplate" TargetType="ListBox">
<!-- ListBox template code here -->
</ControlTemplate>
</Style.Resources>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{Binding RelativeSource={RelativeSource Self}, Path=TargetType}">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
아래는 Button 에 Style을 적용하고 Resource에 두가지의 ControlTemplate을 정의하고 있다.
만약 Style이 적용된 control 이 그냥 Button 이라면 위해서 RelativeSource로 binding 값은 아래와 같이 TargetType="Button" 으로 입력될 것이고 Style.Resources 에서 ButtonTemplate1의 ControlTemplate을 적용하게 된다.
<Style TargetType="Button">
<Style.Resources>
<ControlTemplate x:Key="ButtonTemplate1" TargetType="Button">
<!-- Button template code here -->
</ControlTemplate>
<ControlTemplate x:Key="ButtonTemplate2" TargetType="CustomButton">
<!-- CustomButton template code here -->
</ControlTemplate>
</Style.Resources>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<!-- Default button template code here -->
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
728x90
728x90