如何覆盖全局样式(没有x:Key),或者将命名样式应用于所有以类型为目标的控件?

时间:2009-08-20 02:18:28

标签: wpf xaml styles resourcedictionary

我声明了一个我想要应用于项目中所有按钮的样式,样式位于ResourceDictionary中:

<Style TargetType="StackPanel">
    <Setter Property="Orientation" Value="Horizontal" />
    <Setter Property="VerticalAlignment" Value="Center"/>
    <Setter Property="HorizontalAlignment" Value="Center"/>
</Style>

现在,在某些窗口中,我想继承此样式但添加一个值:

<Style TargetType="StackPanel"> 
    <Setter Property="Margin" Value="5"/>
</Style>

问题是它不会继承全局样式,为了继承我必须为全局样式指定一个键:

<Style TargetType="StackPanel" x:Key="StackPanelStyle" />

然后在窗口的XAML继承(或/和覆盖 - 可选)它:

<Style TargetType="StackPanel" BasedOn="StackPanelStyle" />

问题在于,如果你分配一个密钥,它不是全局的,你必须在每个窗口/范围内调用它。

我的问题的解决方案应该是两个中的一个(还有什么我错过的吗?):

  1. 拥有带键的全局样式,该样式会自动应用于整个应用程序中的所有目标控件。
  2. 一种在不使用和覆盖它的情况下引用ResourceDictionary级别未命名样式的方法。
  3. 我考虑重新声明命名样式(在ResourceDictionary中)附近实际有效的样式:

    <!--In the ResourceDictionary-->
    <Style x:Key="StackPanelStyle" TargetType="StackPanel">
        <Setter Property="Orientation" Value="Horizontal" />
        <Setter Property="VerticalAlignment" Value="Center"/>
        <Setter Property="HorizontalAlignment" Value="Center"/>
    </Style>
    <!--In the app.xaml-->
    <Style TargetType="StackPanel" BasedOn="{StaticResource StackPanelStyle}"/>
    <!--In the window/page scope-->
    <Style TargetType="StackPanel" BasedOn="{StaticResource StackPanelStyle}"/
    

    但我正在寻找更好的东西,而不是愚蠢地重新宣布所有的风格。

3 个答案:

答案 0 :(得分:65)

试试这个:

<Style TargetType="{x:Type StackPanel}" BasedOn="{StaticResource {x:Type StackPanel}}">
  <!-- ... -->
</Style>

我已经在App.xaml的ResourceDictionary中声明了我的基本样式,如果我在这样的特定窗口中覆盖它们,它通常会起作用。

答案 1 :(得分:1)

在全局资源字典中的某处,您可以使用键定义基本样式。此基本样式的目标类型是您打算应用该样式的所有类型的基础类型。然后定义以所需类型为目标的样式,并基于上述基本样式。

<Style
    x:Key="upDownBaseStyle"
    TargetType="{x:Type Control}">
    <Setter
      Property="Margin"
      Value="2" />
    <Setter
      Property="HorizontalAlignment"
      Value="Stretch" />
    <Setter
      Property="VerticalAlignment"
      Value="Center" />
  </Style>

  <Style
    TargetType="{x:Type xceed:IntegerUpDown}"
    BasedOn="{StaticResource upDownBaseStyle}">
  </Style>

  <Style
    TargetType="{x:Type xceed:DoubleUpDown}"
    BasedOn="{StaticResource upDownBaseStyle}">
  </Style>

现在,最后两个样式将应用于应用程序中的所有IntegerUpDown和DoubleUpDown控件,而不会提及任何键。

所以基本规则:基本样式必须具有引用它的键,并且派生样式可能不会,因此它们可以在没有任何键的情况下应用 - 仅由目标类型应用。

答案 2 :(得分:0)

我建议您在这里寻找的是主要样式或行为场景,通常通过创建用户控件来实现。如果您要创建一个应用了“全局”样式的新按钮控件,那么您可以在任何地方使用该控件,只需添加任何“样式”或覆盖样式(如果/何时需要它们)

如果您尚未创建用户控件,则可以轻松实现。