我有一些视觉元素的定义,我想用于两个不同的控件(Button,Thumb).有没有办法摆脱重复的代码?
<Style x:Key="HorizontalSliderThumbStyle" TargetType="{x:Type Thumb}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Thumb}">
this block is the same --> <Grid>
<VisualStateManager.VisualStateGroups>
...
</VisualStateManager.VisualStateGroups>
<Rectangle x:Name="borderRect" Fill="{TemplateBinding BorderBrush}" />
...
<Style x:Key="KeyboardButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
this block is the same --> <Grid>
<VisualStateManager.VisualStateGroups>
...
</VisualStateManager.VisualStateGroups>
<Rectangle x:Name="borderRect" Fill="{TemplateBinding BorderBrush}" />
...
最佳答案 你可以这样做:
<ControlTemplate TargetType="{x:Type Control}" x:Key="SharedControlTemplate">
<Grid>
<Rectangle Fill="{TemplateBinding BorderBrush}"/>
<TextBlock Text="Shared Control Template"/>
</Grid>
</ControlTemplate>
<Style TargetType="{x:Type Thumb}" x:Key="HorizontalSliderThumbStyle">
<Setter Property="Template" Value="{StaticResource SharedControlTemplate}"/>
</Style>
<Style TargetType="{x:Type Button}" x:Key="KeyboardButtonStyle">
<Setter Property="Template" Value="{StaticResource SharedControlTemplate}"/>
</Style>
Thumb和Button都来自Control的基类(不是立即,但它是祖先之一).因此,如果为其定义ControlTemplate,则可以为两个控件提供相同的模板.然后,在风格上,你将根据自己的需要定制他们的个人行为.
使用示例:
<Thumb Style="{StaticResource HorizontalSliderThumbStyle}" BorderBrush="AliceBlue"/>
<Button Style="{StaticResource KeyboardButtonStyle}" BorderBrush="Aquamarine"/>
编辑:
在您提到的评论中,您希望在ControlTemplate中使用ContentPresenter.您必须绑定到ContentControl的Content属性.由于并非每个Control都是ContentControl,因此它仅适用于包含实际内容的控件…但如果它没有内容,则不会发生任何错误.这是改变:
<ControlTemplate TargetType="{x:Type Control}" x:Key="SharedControlTemplate">
<Grid>
<Rectangle Fill="{TemplateBinding BorderBrush}"/>
<TextBlock Text="Shared Control Template"/>
<ContentPresenter Content="{TemplateBinding ContentControl.Content}"/>
</Grid>
</ControlTemplate>
请注意,我为ContentPresenter添加了一行,它绑定到ContentControl的内容.如果你想添加某种内容,它会接受它:
<Thumb Style="{StaticResource HorizontalSliderThumbStyle}" BorderBrush="AliceBlue"/>
<Button Style="{StaticResource KeyboardButtonStyle}" BorderBrush="Aquamarine">
<Rectangle Fill="Red" Width="100" Height="20"/>
</Button>