3

我有几个元素,如果“X”,它们应该看起来都一样。问题是,每个元素的“X”都不同,所以我不能轻易地为它们使用共享样式。但在所有情况下,setter 都是相同的,所以我希望将它们全部放在一个地方。我怎样才能做到这一点?

更具体地说,我有这个代码:

<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>

在这里,我想把这两个Setters放在一个共同的地方,这样我就不必总是一个一个地改变它们。有没有办法做到这一点?

我尝试将一个集合Setter放在一起,然后使用类似DataTrigger.Setters="{StaticResource SharedSetters}". 这不起作用,但如果它起作用,那将正是我想要的。

4

2 回答 2

3

首先,您可以有一个通用样式,它是所有其他样式的基础(BasedOn 属性)。此样式将包含一个由自定义布尔附加属性控制的普通触发器,以及您要重用的设置器。然后,在基于基本样式的其他样式中,您的 DataTriggers 将只设置附加属性,而让基本样式设置所有其他属性。

假设您已经在IsSelectedtype 上创建了附加属性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>
于 2012-11-23T19:17:05.470 回答
0

将设置器的值移动到静态资源并在设置器中设置键。

<SolidColorBrush x:Key="keyName" Color="RoyalBlue" />

<Setter Property="Background" Value="{StaticResource keyName}" />

在你的代码中。

现在您可以更改“keyName”的画笔,它会影响所有设置器。

于 2012-11-23T19:07:14.060 回答