相同的setter用于不同的触发器

时间:2012-11-23 18:57:17

标签: wpf xaml triggers

我有几个元素,如果“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}"之类的内容。这不起作用,但如果确实如此,那就完全是我想要的。

2 个答案:

答案 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。