将单个样式应用于多个控件(并调整每个样式)

时间:2008-12-21 23:10:35

标签: wpf controls styles

我有一个使用自定义样式的WPF应用程序。在其中我有一组按钮,每个按钮都有一个自定义背景图像。对于每个按钮,我提供正常和鼠标按下图像。是否有一种简单的方法可以使用单一样式(并根据具体情况自定义每个按钮)?

目前我正在为每个按钮创建一个新样式,这不是最好的方法吗?

2 个答案:

答案 0 :(得分:11)

对于仅限XAML的解决方案,您可以考虑这一点: -

我假设您正在使用控件模板作为您的样式的一部分,如下所示: -

<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type Button}">
        <Image x:Name="img" Style="{DynamicResource NormalImage}"/>
        <ControlTemplate.Triggers>
          <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Source" TargetName="img" Value="Images\DisabledImage.png"/>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

我已经在这里屠杀了控制模板,你的可能更复杂

现在,如果您在与上述样式相同的区域中添加以下样式,那么这将指定用于默认情况的图像

<Style x:Key="NormalImage" TargetType="{x:Type Image}">
  <Setter Property="Source" Value="Images/DeafultImage.png"/>
</Style>

当你需要使用按钮时,你可以在XAML中进一​​步向下: -

<Button Style="{DynamicResource MyButtonStyle}" >
  <Button.Resources>
    <Style x:Key="NormalImage" TargetType="{x:Type Image}">
      <Setter Property="Source" Value="Images/OverrideImage.png"/>
    </Style>
  </Button.Resources>
</Button>

它不漂亮,但仍然允许主风格,并且比使用多种风格稍微更短,更少重复。

它的工作方式是首先在按钮的资源(通常为空)中搜索资源名称“NormalImage”,然后是父容器,一直到页面/窗口资源,直到应用程序资源。第一个匹配获胜,因此在这种情况下,在窗口/页面/容器级别资源之前选择引用OverrideImage.png的本地定义的名为“NormalImage”的样式,其名称与引用DefaultImage.png相同

进一步减少文字数量

如果所有按钮或大多数按钮都使用此样式,则从样式定义中删除x:Key =“MyButtonStyle”。这样,WPF将在范围内的所有按钮上使用该样式,而无需明确指定样式。然后,您可以使用style =“{x:null}”明确地不使用默认样式。因此: -

<Window.Resources>
  <Style x:Key="NormalImage" TargetType="{x:Type Image}">
    <Setter Property="Source" Value="Images/DeafultImage.png"/>
  </Style>

  <Style TargetType="{x:Type Button}">
    <Setter Property="Template">
            ...
    </Setter>
  </Style>
</Window.Resources>

<Button >
  <Button.Resources>
    <Style x:Key="NormalImage" TargetType="{x:Type Image}">
      <Setter Property="Source" Value="Images/OverrideImage.png"/>
    </Style>
  </Button.Resources>
</Button>

<Button Style="{x:null}>Normal Button</Button>

答案 1 :(得分:0)

您可以在ResourceDictionary中创建样式,然后将该字典合并到控件资源中。如果您为该样式指定一个键,则可以将任何按钮绑定到该样式。

例如:

<Style x:Key="imageButton" ControlType="{x:Type Button}">
    ...
</Style>

<Button Style="{DynamicResource imageButton}" />