使用单一样式设置Hyperlink和TextBlock的样式?

el2*_*ot2 3 wpf xaml styles textblock

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

 public enum Modes
 {
   A,
   B,
   C
 }
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

一个使用场景是System.Windows.Documents.Hyperlink嵌套的System.Windows.Controls.TextBlock:

<Hyperlink><TextBlock/></Hyperlink>
Run Code Online (Sandbox Code Playgroud)

另一个很简单TextBlock:

<TextBlock Style="{StaticResource Coloring}" Text="yada"/>
Run Code Online (Sandbox Code Playgroud)

当然,我可以设计两个TextBlock元素:

<TextBlock Style="{StaticResource Coloring}" Text="yada"/>
<Hyperlink><TextBlock Style="{StaticResource Coloring}"/></Hyperlink>
Run Code Online (Sandbox Code Playgroud)

但这无法确定Hyperlink案例的下划线风格.

如果我尝试两种类型的样式:

<TextBlock Style="{StaticResource Coloring}" Text="yada"/>
<Hyperlink Style="{StaticResource Coloring}"><TextBlock/></Hyperlink>
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mat*_*ton 6

您可以强制超链接与其父TextBlocks具有相同的前景色,方法是将它们绑定在样式本身中,如下所示:

<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>
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我添加了一个setter来使默认前景为Orange,仅用于测试目的.