我们正在为大多数类型使用全局样式定义。我们在app.xaml文件中定义。使用TextBlock时,定义前景色是一个问题,因为它使用TextBlock(例如Button的内容颜色)更改所有控件。 我们如何定义一个仅对特定TextBlock用法起作用的全局样式?
目前有问题的用法:
<Style TargetType={x:Type TextBlock}>
<Setter Property="Foreground" Value="Red"/>
</Style>
答案 0 :(得分:2)
由于我认为没有办法区分“你的”TextBlock
和那些属于其他控件的人,你的选择非常有限。
Style
并将Style="{StaticResource coloredTextBlock}"
或Foreground="{StaticResource textBlockColor}"
添加到所有TextBlock
。这将是非常乏味和非干。TextBlock
并设置样式。这有上述解决方案的一些缺点(你必须记住这样做)。但它的重复次数要少得多。答案 1 :(得分:2)
这是因为ContentPresenter
为字符串内容创建了一个TextBlock,并且由于TextBlock不在可视树中,因此它将查找到应用程序级资源。如果在应用程序级别为TextBlock定义样式,则它将应用于ControlControls中的这些TextBlock。
解决方法是为DataTemplate
定义System.String
,我们可以在其中明确使用默认的TextBlock来显示内容。您可以将DataTemplate放在定义TextBlock样式的同一个字典中,以便将此DataTemplate应用于受您的样式影响的任何ContentPresenter。
将此添加到您的应用程序资源中,它应该适合您 -
<DataTemplate DataType="{x:Type system:String}">
<TextBlock Text="{Binding}">
<TextBlock.Resources>
<Style TargetType="{x:Type TextBlock}"/>
</TextBlock.Resources>
</TextBlock>
</DataTemplate>
在你的xaml中声明一个命名空间,如果没有引用它 -
xmlns:system="clr-namespace:System;assembly=mscorlib"
编辑:检查此示例的工作位置..
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="Red"/>
</Style>
<DataTemplate DataType="{x:Type system:String}">
<TextBlock Text="{Binding}">
<TextBlock.Resources>
<Style TargetType="{x:Type TextBlock}"/>
</TextBlock.Resources>
</TextBlock>
</DataTemplate>
<Style TargetType="{x:Type Button}">
<Setter Property="Foreground" Value="Yellow"/>
</Style>
<Style TargetType="{x:Type Label}">
<Setter Property="Foreground" Value="Blue"/>
</Style>
答案 2 :(得分:1)
只需在样式中提供x:键,例如:
<Style x:Key="stRedTextBlock" TargetType={x:Type TextBlock}>
<Setter Property="Foreground" Value="Red"/>
</Style>
并提及TextBlock控件样式中的键,您需要这种特定的TextBlock样式,例如:
<TextBlock Name="textBlock1" Style="{StaticResource stRedTextBlock}" />