我有几个元素,如果“X”,它们看起来都一样。问题是,“X”对于每个元素都是不同的,所以我不能轻易地为它们使用共享样式。但在所有情况下,制定者都是一样的,所以我想把它们放在一个地方。我怎样才能做到这一点?
更具体地说,我有这段代码:
<TextBlock Name="text1">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedMonth, Converter={conv:IsNullConverter}}"
Value="False">
<Setter Property="Background" Value="RoyalBlue" />
<!-- possibly other setters -->
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<TextBlock Name="text2">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected}" Value="True">
<Setter Property="Background" Value="RoyalBlue" />
<!-- possibly other setters, same ones as above -->
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
在这里,我想将两个Setter
放在一个共同的地方,这样我就不必一个一个地改变它们。有没有办法做到这一点?
我尝试将Setter
的集合放在一起,然后使用DataTrigger.Setters="{StaticResource SharedSetters}"
之类的内容。这不起作用,但如果确实如此,那就完全是我想要的。
答案 0 :(得分:3)
首先,您可以拥有一个共同的样式,它将成为所有其他样式的基础(BasedOn属性)。此样式将包含由自定义布尔附加属性控制的普通Trigger,以及要重用的setter。然后,在基于基本样式的其他样式中,DataTriggers将仅设置附加属性,并让基本样式设置所有其他属性。
假设您已在类型IsSelected
上创建附加属性Foo
,基本样式将如下所示:
<Style x:Key="IsSelectedStyle" TargetType="TextBlock">
<Style.Triggers>
<Trigger Property="local:Foo.IsSelected" Value="True">
<Setter Property="Background" Value="RoyalBlue" />
<!-- possibly other setters -->
</Trigger>
</Style.Triggers>
</Style>
然后你会像这样使用它:
<TextBlock>
<TextBlock.Style>
<Style TargetType="TextBlock" BasedOn="{StaticResource IsSelectedStyle}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected}" Value="True">
<Setter Property="local:Foo.IsSelected" Value="True" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
答案 1 :(得分:0)
将setter的值移动到静态资源,并在setter中设置键。
<SolidColorBrush x:Key="keyName" Color="RoyalBlue" />
和
<Setter Property="Background" Value="{StaticResource keyName}" />
你的代码中的。
现在你可以更改“keyName”的画笔,它会影响所有的setter。