【问题标题】:Styling both Hyperlink and TextBlock with a single style?使用单一样式设置超链接和文本块的样式?
【发布时间】:2011-01-15 22:05:42
【问题描述】:

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

 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>

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

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

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

【问题讨论】:

    标签: wpf xaml styles textblock


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。在 WPF 中完成任务的方法有很多。我想我现在已经足够前进了。
    【解决方案2】:

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

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

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

    【讨论】:

    • 这看起来像无效的 XML。
    猜你喜欢
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    相关资源
    最近更新 更多