如何在WPF中设置样式和样式触发器

时间:2019-02-28 18:46:12

标签: wpf app.xaml

我正在尝试将WPF内容控件的样式设置为动态资源。我可以很容易地做到这一点:

<ContentControl  Style="{DynamicResource RibbonGroup}">
   ...
</ContentControl>

如果要向内容控件添加样式触发器,可以执行以下操作:

<ContentControl>
  <ContentControl.Style>
   <Style TargetType="ContentControl">
    <Style.Triggers>
      <DataTrigger Binding="{Binding Path=ShowImport}" Value="True">
        <Setter Property="Visibility" Value="Visible"/>
      </DataTrigger>
      <DataTrigger Binding="{Binding Path=ShowImport}" Value="False">
        <Setter Property="Visibility" Value="Collapsed"/>
      </DataTrigger>
    </Style.Triggers>
  </Style>
  ...
</ContentControl>

如果我尝试将它们组合在一起以设置控件样式并触发如下:

<ContentControl  Style="{DynamicResource RibbonGroup}">
  <ContentControl.Style>
   <Style TargetType="ContentControl">
    <Style.Triggers>
      <DataTrigger Binding="{Binding Path=ShowImport}" Value="True">
...

此XAML会产生一个错误,指出属性“样式”已设置多次。

XAML将样式设置为动态资源并包含样式触发器的外观是什么。

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

您不能将两种不同的样式添加到一个单一控件中,而您必须将其合而为一!

<ContentControl>
  <ContentControl.Style>
   <Style TargetType="ContentControl">
    <Style.Triggers>
      <DataTrigger Binding="{Binding Path=ShowImport}" Value="True">
        <Setter Property="Visibility" Value="Visible"/>
      </DataTrigger>
      <DataTrigger Binding="{Binding Path=ShowImport}" Value="False">
        <Setter Property="Visibility" Value="Collapsed"/>
      </DataTrigger>
    </Style.Triggers>
  </Style>
  ...
  <Style.Triggers>
    <DataTrigger Binding="{Binding Path=ShowImport}" Value="True">
  ...
</ContentControl>

但是,您似乎想要使两种样式共享某些属性,在这种情况下,您可以创建BaseStyle和secund样式,并在其中添加BasedOn属性,如下所示:

<Style TargetType="ContentControl" BasedOn="{StaticResource <X:Key_From_Base_Style>}">

答案 1 :(得分:0)

如前所述,您设置了两次样式。不要这样做,请使用basedon来添加您拥有的样式作为资源。

 <ContentControl>
    <ContentControl.Style>
           <Style TargetType="ContentControl" BasedOn="{StaticResource RibbonGroup}">