【问题标题】:Using trigger to change property of many items使用触发器更改许多项目的属性
【发布时间】:2011-07-29 15:56:47
【问题描述】:

我创建了一个 WPF 自定义控件,效果很好。 它有一个设置一些属性的样式和一个模板。

现在我想更改控件,使其具有“活动”属性。 如果这是真的,它应该使用属性“ActiveBrush”作为描边 模板中的一些矩形,否则它应该使用“InactiveBrush”。

我想使用 ActiveBrush 作为默认 Stroke,并将其更改为 InactiveBrush 带触发器。

当我使用这个时,这适用于一个矩形:

<Trigger Property="Active" Value="False">
  <Setter TargetName="Rec1" Property="Stroke" Value="{Binding Path=InactiveBrush, RelativeSource={RelativeSource TemplatedParent}}"/>
</Trigger>

但由于我不想使用单独的设置器设置每个矩形,所以我问自己是否应该使用一个设置器设置模板中所有矩形的属性。

我已经试过了:

<Trigger Property="Active" Value="False">
  <Setter Property="Rectangle.Stroke" Value="{Binding Path=InactiveBrush, RelativeSource={RelativeSource TemplatedParent}}"/>
</Trigger>

但这没有用。

有没有人建议,如何实现这个?

提前致谢。

【问题讨论】:

    标签: c# wpf xaml triggers styles


    【解决方案1】:

    @Robert Rossney - 此样式不会运行,因为 Rectangle 的目标类型没有 Active 属性。但这是正确的道路,只需稍作改动:

    <Style TargetType="Rectangle">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Active, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyControl}}}" Value="False">
                <Setter Property="Stroke" Value="{Binding Path=InactiveBrush, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyControl}}}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
    

    此样式应嵌套在控件样式的 Style.Resources 或控件的 ControlTemplate 的 ControlTemplate.Resources 中。这样,您就可以将此样式本地化到您的控件中。您无法控制的任何矩形都不会受到影响。

    【讨论】:

    • 我尝试了您的解决方案,但没有成功。没有错误,只是没有改变 Stroke。
    • 问题是:我用 'Stroke="..."' 设置的默认 Stroke 覆盖了样式设置的值。通过将 2 DataTrigger (Active/Inactive) 添加到 Style 并保留未设置的默认值,它可以工作。但也只能在 Style 中使用 x:Key 和在 Rectangle 中使用 Style=...。
    • @Marks - 你提出了一个很好的观点,即为依赖属性设置值的优先级。 This MSDN article 应该是一个很好的参考(现在加载页面有一些问题来验证它)。为了使代码更具可读性,您可以在样式的设置器中设置它而不是 Active=true 的触发器,而 Active=false 的触发器将过度供电。
    【解决方案2】:

    我相信您知道这一点,但只是忽略了它:如果您想将样式应用于某个类型的所有控件,请使用该类型的 TargetType 创建一个样式并将其放入自定义控件的资源字典中.如果您仍需要将特定样式应用于该类型的各个控件,请使用 BasedOn 属性定义这些样式。

    所以,在您的 MyControl.Resources 元素中,您可以输入:

    <Style TargetType="Rectangle">
       <Style.Triggers>
          <Trigger Property="Active" Value="False">
             <Setter Property="Stroke" Value="{Binding Path=InactiveBrush, RelativeSource={RelativeSource TemplatedParent}}"/>
          </Trigger>
       <Style>
    <Style>
    

    任何需要自己风格的Rectangle 都可以这样开头:

    <Style TargetType="Rectangle" BasedOn="{StaticResource {x:Type Rectangle}}">
    

    【讨论】:

      猜你喜欢
      • 2010-11-04
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多