【问题标题】:How to define all textblock elements the same color如何将所有文本块元素定义为相同的颜色
【发布时间】:2011-12-14 03:18:42
【问题描述】:

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

当前有问题的用法:

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

【问题讨论】:

    标签: wpf styles


    【解决方案1】:

    由于我认为没有办法区分“您的”TextBlocks 和属于其他控件的那些,因此您的选择非常有限。

    • 您可以创建命名Style 并将Style="{StaticResource coloredTextBlock}"Foreground="{StaticResource textBlockColor}" 添加到所有TextBlocks。这将非常乏味且不干燥。
    • 您可以创建自己的继承自TextBlock 的类型并为其设置样式。这具有上述解决方案的一些缺点(您必须记住这样做)。但它的重复性要少得多。

    【讨论】:

      【解决方案2】:

      这是因为ContentPresenter 为字符串内容创建了一个TextBlock,并且由于该TextBlock 不在可视树中,因此它将查找应用程序级资源。如果您在应用程序级别为 TextBlock 定义样式,那么它将应用于 ControlControls 中的这些 TextBlock。

      一种解决方法是为System.String 定义一个DataTemplate,我们可以显式使用默认的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>
      

      【讨论】:

      • 谢谢。其他使用 TextBlock 样式的控件呢(显式)?
      • 顺便说一句,我尝试使用 TextBlock.Foreground="Red" 添加特定的 UserControl 样式,但没有任何影响。有什么想法吗?
      • 我已经使用我刚刚定义的 DataTemplate 对小型应用程序进行了测试。这不适合你吗??
      • 我已经更新了我的答案。看一看。在此示例中,所有按钮的前景色为黄色,所有标签的前景色为蓝色,文本块的前景色为红色。
      • 因为您通过显式定义来覆盖 Button 和 label 的样式。所以,它会起作用。 :) 此外,如果使用 Textblock 的其他控件,如果没有在本地级别定义样式,即。在 UserControl 级别,然后在这种情况下,它将查找应用程序级别的资源并应用该样式。
      【解决方案3】:

      只需在样式中提供一个 x:key,例如:

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

      并在 TextBlock 控件样式中提及键,在您需要此特定 TextBlock 样式的任何地方,例如:

      <TextBlock Name="textBlock1" Style="{StaticResource stRedTextBlock}" />
      

      【讨论】:

      • 这种方式很繁琐,因为我需要为每个元素添加样式。我想要一个全局样式,它可以在每个文本块元素中没有特定样式的情况下工作
      猜你喜欢
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多