如何将样式基于资源字典中的另一种样式?

Mar*_*com 20 wpf xaml styles

我有一个主题应用于资源字典中的所有按钮.现在我想在继承字典中的样式更改时向按钮添加触发器.我尝试了以下代码,但它说无法找到控件.我该如何解决?

<UserControl.Resources>
  <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
          <ResourceDictionary Source="Theme.xaml"/>
      </ResourceDictionary.MergedDictionaries>

      <conv:ErrorContentConverter x:Key="ErrorContentConverter" />

      <Style x:Key="ValidTrigger" 
             TargetType="Control" BasedOn="{StaticResource {x:Type Control}}">
         <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsValid}" Value="False">
              <Setter Property="IsEnabled" Value="false" />
            </DataTrigger>
         </Style.Triggers>
      </Style>   
  </ResourceDictionary>
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)

基本模板:

    <Style TargetType="{x:Type Button}" BasedOn="{x:Null}">
    <Setter Property="FocusVisualStyle" 
            Value="{DynamicResource NuclearButtonFocusVisual}" />
    <Setter Property="Foreground" Value="#FF042271" />
    <Setter Property="FontFamily" Value="Trebuchet MS" />
    <Setter Property="FontSize" Value="12" />
    <Setter Property="Padding" Value="3" />

    <Setter Property="Template" Value="{DynamicResource ButtonTemplate}" />
</Style>
Run Code Online (Sandbox Code Playgroud)

Nat*_*end 23

我过去使用过的一个技巧:在你ResourceDictionary的应用程序中为你的应用程序定义毛毯样式,添加一个x:Key你想要继承的样式,如下所示:

<Style TargetType="{x:Type Button}" x:Key="ButtonStyle">
  <!-- your style here -->
</Style>
Run Code Online (Sandbox Code Playgroud)

要将此样式应用于指定类型的所有控件(Button在此示例中)而不必显式设置Styleevery 的属性Button,请添加另一个样式,即BasedOn此样式但没有键:

<Style TargetType="{x:Type Button}" BasedOn="{StaticResource ButtonStyle}" />
Run Code Online (Sandbox Code Playgroud)

使用此方法,Button应用程序中的所有内容都将自动继承您的自定义样式,但您仍然可以创建其他样式BasedOnButtonStyle条目,并避免吹走所有自定义样式.


Pie*_*ler 20

给你的基础风格一个名字,比如说FooStyle.

在您给出的示例中,修改TargetType和BasedOn,如下所示:

 <Style x:Key="ValidTrigger" 
        TargetType="{x:Type Control}" BasedOn="{StaticResource {x:Type Control}}" >
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=IsValid}" Value="False">
            <Setter Property="IsEnabled" Value="false" />
        </DataTrigger>
    </Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)

  • @PieterMüller:如果您为样式分配了键,则默认情况下,上下文中所有匹配的控件将不再使用该样式。Nathan Friend的答案为此提供了解决方案。我只是遇到了同样的问题:) (2认同)