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