【问题标题】:Applying same style to multiple elements将相同的样式应用于多个元素
【发布时间】:2013-08-12 09:06:23
【问题描述】:

我是使用 WPF 的新手,我正在尝试应用 Style(例如,TextBoxButtonMenuItem 的背景应该是橙色)。为了实现这一点,我做了类似的事情:

<Style TargetType="TextBox" x:Key="sampleTextBox">
    <Setter Property="Margin" Value="2"/>
    <Setter Property="FontFamily" Value="Verdana"/>
    <Setter Property="FontSize" Value="11px"/>
    <Setter Property="FontWeight" Value="Bold"/>
    <Setter Property="Background">
        <Setter.Value>
            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" >
                <GradientStop Color="#FFFFD190" Offset="0.2"/>
                <GradientStop Color="Orange" Offset="0.85"/>
                <GradientStop Color="#FFFFD190" Offset="1"/>
            </LinearGradientBrush>
        </Setter.Value>
    </Setter>
</Style>

并为目标类型Button 和目标菜单重复相同的代码。 这工作得很好。但我想通过可能有多个 targettype 值来最小化重复代码的数量。

如果可能,请告诉我。

谢谢。

【问题讨论】:

    标签: wpf xaml styles


    【解决方案1】:
      <Window.Resources>
        <Style x:Key="sampleTextBox">
            <Setter Property="Control.FontFamily" Value="Verdana"/>
            <Setter Property="Control.FontSize" Value="11px"/>
            <Setter Property="Control.FontWeight" Value="Bold"/>
            <Setter Property="Control.Background">
                <Setter.Value>
                    <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" >
                        <GradientStop Color="#FFFFD190" Offset="0.2"/>
                        <GradientStop Color="Orange" Offset="0.85"/>
                        <GradientStop Color="#FFFFD190" Offset="1"/>
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    
    <StackPanel>
        <TextBlock Text="This is a string and it should be wrapped." Style="{StaticResource sampleTextBox}"/>
        <TextBox Text="This is a string and it should be wrapped." Style="{StaticResource sampleTextBox}"/>
    </StackPanel>
    

    【讨论】:

    • 谢谢。我一直在尝试这个。不知道删除 targettype 会变魔术 :)
    • @Deeksha 您还应该查看StyleBasedOn 属性。我相信你迟早会发现它有用的。 +1 对 otis23 的回答
    【解决方案2】:

    样式有一个属性BasedOnhttp://msdn.microsoft.com/en-us/library/system.windows.style.basedon.aspx 有了这个,您可以使用样式继承。定义具有通用属性的基本样式并派生具有特定属性的子样式。

    【讨论】:

      【解决方案3】:

      您可以将FrameworkElement 用作TargetType

      <Style TargetType="FrameworkElement" x:Key="CommonStyle">
          <Setter Property="Control.Background">
              <Setter.Value>
                  <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" >
                      <GradientStop Color="#FFFFD190" Offset="0.2"/>
                      <GradientStop Color="Orange" Offset="0.85"/>
                      <GradientStop Color="#FFFFD190" Offset="1"/>
                  </LinearGradientBrush>
              </Setter.Value>
          </Setter>
      </Style>
      

      然后通过inheriting (BasedOn)CommonStyle为每个元素使用特定样式:

      <Style TergetType="TextBox" BasedOn="{StaticResource CommonStyle}" x:Key="TextBoxStyle">
           <Setter Property="Margin" Value="2"/>
           <Setter Property="FontFamily" Value="Verdana"/>
           <Setter Property="FontSize" Value="11px"/>
           <Setter Property="FontWeight" Value="Bold"/>
      </Style>
      

      【讨论】:

      • 嗨,我试过这个方法,但它说背景不是 FrameworkElemnt 上的有效属性。只有 FrameworkElement 上的边距适用。
      • 感谢您的回答。是的,将它与 Control.Background/任何属性一起使用确实解决了我的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多