3

我有两种类型的文本需要遵循基于枚举的类似着色规则:

 public enum Modes
 {
   A,
   B,
   C
 }

带有DataTrigger标记的样式用于着色:

      <Style TargetType="SEE BELOW" x:Key="Coloring">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=.}" Value="A">
                    <Setter Property="Foreground" Value="Red" />
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=.}" Value="B">
                    <Setter Property="Foreground" Value="Green" />
                </DataTrigger>
               <DataTrigger Binding="{Binding Path=.}" Value="C">
                    <Setter Property="Foreground" Value="Blue" />
                </DataTrigger>
            </Style.Triggers>
        </Style>

一种使用场景是System.Windows.Documents.Hyperlink带有嵌套的System.Windows.Controls.TextBlock

<Hyperlink><TextBlock/></Hyperlink>

另一个只是一个简单的TextBlock

<TextBlock Style="{StaticResource Coloring}" Text="yada"/>

当然,我可以为这两个TextBlock元素设置样式:

<TextBlock Style="{StaticResource Coloring}" Text="yada"/>
<Hyperlink><TextBlock Style="{StaticResource Coloring}"/></Hyperlink>

但这无法为超链接案例的下划线设置样式。

如果我尝试在这两种类型中设置样式:

<TextBlock Style="{StaticResource Coloring}" Text="yada"/>
<Hyperlink Style="{StaticResource Coloring}"><TextBlock/></Hyperlink>

然后样式失败,因为(显然)没有共同的祖先类型用于TargetTypeStyle 的属性。

由于这最终被认为是可配置的,因此目标是拥有一个 XAML 文档,该文档定义了这些文本块的颜色映射模式。因此,我不愿意使用定义相同映射的两种冗余样式(一种用于 Hyperlink,一种用于 TextBlock)。

所以......问题:如何在没有多余的 Style XAML 块的情况下一致地设置两种情况的样式?

4

2 回答 2

6

您可以通过将超链接绑定在样式本身中来强制超链接具有与其父文本块相同的前景色,如下所示:

<Style TargetType="TextBlock" x:Key="Coloring">
        <Style.Resources>
            <Style TargetType="Hyperlink">
                <Setter Property="Foreground" Value="{Binding Foreground,RelativeSource={RelativeSource FindAncestor,AncestorType=TextBlock}}"/>
            </Style>
        </Style.Resources>
            <Setter Property="Foreground" Value="Orange"/>
        <Style.Triggers>
        <DataTrigger Binding="{Binding Path=.}" Value="A">
            <Setter Property="Foreground" Value="Red" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=.}" Value="B">
            <Setter Property="Foreground" Value="Green" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=.}" Value="C">
            <Setter Property="Foreground" Value="Blue" />
        </DataTrigger>
    </Style.Triggers>
</Style>

在此示例中,我添加了一个设置器以使默认前景为橙色,仅用于测试目的。

于 2010-02-11T22:06:06.020 回答
0

发布后,我意识到了另一种方法。我用嵌套的 TextBlock 场景强制超链接。如果我要将超链接包装在 TextBlock 中:

<TextBlock Style="{StaticResource Coloring}"><Hyperlink><TextBlock/></HyperLink></TextBlock>

然后我的两个案例都折叠为 TextBlock 样式。(结合上面的解决方案)

于 2010-02-11T22:08:07.707 回答