Wpf 附「;标签";设置样式的元素

Wpf 附「;标签";设置样式的元素,wpf,xaml,wpf-style,Wpf,Xaml,Wpf Style,我有9个按钮,它们是Canva内部的Polygon。每个按钮都是一个“方向” 当它们被“选中”时,我需要一种特殊的填充颜色(当我单击一个方向时,它会在ViewModel中设置一个属性) 我可以很容易地这样做: <Button Command="{Binding SelectNewOrientationCommand}" CommandParameter="{x:Static local:OrientationEditorDirection.Top}" > <Button

我有9个按钮,它们是
Canva
内部的
Polygon
。每个按钮都是一个“方向”

当它们被“选中”时,我需要一种特殊的
填充
颜色(当我单击一个方向时,它会在ViewModel中设置一个属性)

我可以很容易地这样做:

<Button Command="{Binding SelectNewOrientationCommand}" CommandParameter="{x:Static local:OrientationEditorDirection.Top}" >
    <Button.Template>
        <ControlTemplate>
            <Polygon Points="4,0 8,0 8,6 12,6 12,24 0,24 0,6 4,6"  RenderTransformOrigin="0.5,1.75" >
                <Polygon.Resources>
                    <Style TargetType="Polygon">
                        <Setter Property="Fill" Value="Blue" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding SelectedDirection, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"
                                         Value="{x:Static local:OrientationEditorDirection.Top}" />
                        </Style.Triggers>
                    </Style>
                </Polygon.Resources>
                <Polygon.RenderTransform>
                    <TransformGroup>
                        <TranslateTransform X="40" Y="4"/>
                    </TransformGroup>
                </Polygon.RenderTransform>
            </Polygon>
        </ControlTemplate>
    </Button.Template>
</Button>

这是可行的,但这意味着我必须复制粘贴此样式9次,并进行维护9次

我不能把这个“原样”放在Canva资源中,因为我必须能够为每个按钮单独指定它触发特定值的值

当我声明按钮时,是否有方法表明我的按钮用于
Top
值,然后在我的DataTrigger中查找此“Top”值


谢谢!

您可以有多个数据触发器-每个方向一个-在一种样式中:

<DataTrigger Binding="{Binding SelectedDirection, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"
             Value="{x:Static local:OrientationEditorDirection.Top}" >
     <Setter Property="Fill" Value="Red"/>
</DataTrigger >
<DataTrigger Binding="{Binding SelectedDirection, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"
             Value="{x:Static local:OrientationEditorDirection.Bottom}" >
     <Setter Property="Fill" Value="Green"/>
</DataTrigger >

您可以创建一个基本
样式
,将
控制模板
中的
多边形
填充
属性绑定到
按钮
的属性,然后基于每个
按钮的基本样式创建特定样式

<Style x:Key="ButtonStyle" TargetType="Button">
    <Setter Property="Background" Value="Blue" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Polygon Points="4,0 8,0 8,6 12,6 12,24 0,24 0,6 4,6"  RenderTransformOrigin="0.5,1.75"
                                 Fill="{TemplateBinding Background}">
                    <Polygon.RenderTransform>
                        <TransformGroup>
                            <TranslateTransform X="40" Y="4"/>
                        </TransformGroup>
                    </Polygon.RenderTransform>
                </Polygon>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>




你不能重复使用实际的
DataTrigger

我想你误解了,但是每个按钮必须是相同的颜色,只有选定的一个应该是这种颜色。以你的例子来说,所有按钮都将是相同的颜色,这取决于我单击的按钮。事实上,这几乎与我所寻找的相反。我的polyg在上,每个按钮的翻译…都不同,因此我无法将其放在同一个位置。我正在寻找一种方法来使用相同的dataTrigger(除了
值)。这是不可能的。您不能“重用”类似这样的数据触发器。如果每个按钮的多边形不同,有什么可重用的?那么您应该为每个按钮定义单独的样式或模板。颜色相同;),并且样式触发器的源相同。然后将颜色定义为资源,并在每个模板中引用它们。
<Button>
    <Button.Style>
        <Style TargetType="Button" BasedOn="{StaticResource ButtonStyle}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding SelectedDirection, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"
                             Value="{x:Static local:OrientationEditorDirection.Top}">
                    <Setter Property="Background" Value="Red" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

<Button>
    <Button.Style>
        <Style TargetType="Button" BasedOn="{StaticResource ButtonStyle}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding SelectedDirection, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"
                             Value="{x:Static local:OrientationEditorDirection.Bottom}">
                    <Setter Property="Background" Value="Green" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>