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)
然后样式失败,因为(显然)没有共同的祖先类型用于TargetType
Style 的属性.
由于这最终是一个可配置的东西,目标是有一个XAML文档,定义这些文本块的颜色映射模式.因此,我不愿意为两个冗余样式(一个用于Hyperlink,一个用于TextBlock)定义相同的映射.
所以...问题:如何在没有冗余样式XAML块的情况下始终如一地设置两种情况?
您可以强制超链接与其父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,仅用于测试目的.
归档时间: |
|
查看次数: |
5561 次 |
最近记录: |