我创建了一个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>
但这不起作用。
有没有人提出建议,如何实施?
提前致谢。
答案 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中。这样,您只能将此样式本地化为您的控件。您控件之外的任何矩形都不会受到影响。