使用触发器更改许多项的属性

时间:2011-07-29 15:56:48

标签: c# wpf xaml triggers styles

我创建了一个WPF自定义控件,工作正常。 它有一个设置一些属性和模板的样式。

现在我想更改控件,因此它具有'Active'属性。 如果这是真的,它应该使用Property'ActiveBrush'作为Stroke 模板中的一些矩形,否则它应该使用'InactiveBrush'。

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

当我使用它时,这适用于一个Rectangle:

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

但是因为我不想用一个单独的setter来设置每个矩形,所以我问自己是不是可以用一个Setter设置模板中所有Rectangle的属性。

我已经尝试过:

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

但这不起作用。

有没有人提出建议,如何实施?

提前致谢。

2 个答案:

答案 0 :(得分:1)

我确定你知道这一点,但只是忽略它:如果你想将一个样式应用于一个类型的所有控件,创建一个具有该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}}">

答案 1 :(得分: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中。这样,您只能将此样式本地化为您的控件。您控件之外的任何矩形都不会受到影响。