我有两种类型的文本需要遵循基于枚举的相似着色规则:
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.TextBlock
的 System.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/