如何定义所有文本块元素相同的颜色

时间:2011-10-24 13:11:53

标签: wpf styles

我们正在为大多数类型使用全局样式定义。我们在app.xaml文件中定义。使用TextBlock时,定义前景色是一个问题,因为它使用TextBlock(例如Button的内容颜色)更改所有控件。 我们如何定义一个仅对特定TextBlock用法起作用的全局样式?

目前有问题的用法:

<Style TargetType={x:Type TextBlock}>
  <Setter Property="Foreground" Value="Red"/>
</Style>

3 个答案:

答案 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}" />