.net – 对两个ControlTemplates使用相同的定义

我有一些视觉元素的定义,我想用于两个不同的控件(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>
点赞