wpf - 使用单一样式同时设置 Hyperlink 和 TextBlock 的样式?

标签 wpf xaml styles textblock

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

 public enum Modes
 {
   A,
   B,
   C
 }

带有 DataTrigger 标记的 Style 用于着色:

      <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.Controls.TextBlockSystem.Windows.Documents.Hyperlink:

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

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

由于这最终应该是一个可配置的东西,因此目标是拥有一个 XAML 文档,该文档定义了这些文本 block 的颜色映射模式。因此,我不愿意使用定义相同映射的两种冗余样式(一种用于超链接,一种用于文本 block )。

那么……问题是:如何在没有冗余 Style XAML block 的情况下一致地设置两种情况的样式?

最佳答案

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

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

在这个例子中,我添加了一个 setter 来设置默认前景橙色,仅用于测试目的。

关于wpf - 使用单一样式同时设置 Hyperlink 和 TextBlock 的样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2247987/

相关文章:

wpf - 从 .Net 标准项目中使用 .Net Core 库

WPF DataGrid 编程多行选择

c# - WPF如何设置圆形按钮

.net - DisplayMemberPath 等属性成为依赖属性的原因/场景是什么?

c# - 我如何添加自定义属性,如 x :Name ="value"?

xaml - 绑定(bind)到 ControlTemplate 内的嵌套属性

wpf - 为什么我的文字被裁剪了?

html - 我的 Css 类不适用于我的 html 文件

html - 如何柔化 html 边框颜色(不要太不透明)

css - "Nav"图像之前和之后