【问题标题】:How do I set the style and a style trigger in WPF如何在 WPF 中设置样式和样式触发器
【发布时间】:2019-07-22 18:12:33
【问题描述】:

我正在尝试将 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 是什么样的。

感谢您提供的任何帮助。

【问题讨论】:

    标签: wpf app.xaml


    【解决方案1】:

    正如它所说,您设置了两次样式。不要那样做,使用 basedon 添加到您作为资源拥有的样式中。

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

    【讨论】:

    • 谢谢安迪,我试过了,结果是运行时错误:不能在“Style”类型的“BasedOn”属性上设置“DynamicResourceExtension”。只能在 DependencyObject 的 DependencyProperty 上设置“DynamicResourceExtension”。来源=演示框架。很抱歉,我不明白这个错误是什么意思。
    • 这意味着我忘记了基于仅适用于静态资源。
    【解决方案2】:

    您不能将两种不同的样式添加到一个单独的控件中,您必须在一个控件中添加!

    <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 和一个添加 BasedOn 属性的第二个样式,如下所示:

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

    【讨论】:

    • 感谢您的建议。我使用的是动态资源。不确定 StaticResource 和 DynamicResource 在这里是否可以互换。
    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2011-09-20
    • 2012-03-14
    • 2018-03-06
    • 1970-01-01
    • 2011-09-30
    相关资源
    最近更新 更多