我正在创建一个从切换按钮扩展的简单自定义控件,允许用户直接在XAML中指定已检查和未检查的内容。它运行良好,但它基于一个触发器,我不知道如何定义触发器,除了一个样式。如果我定义了样式,那么我将失去在自定义控件之外设置的任何内容。
我希望能够做的就是将此触发器附加到控件上其他任何现有样式集。
这是样式/触发器的XAML。
<ToggleButton.Style>
<Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource {x:Type ToggleButton}}">
<Setter Property="Content" Value="{Binding RelativeSource={RelativeSource Self}, Path=UncheckedContent}" />
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Content"
Value="{Binding RelativeSource={RelativeSource Self}, Path=CheckedContent}" />
</Trigger>
</Style.Triggers>
</Style>
</ToggleButton.Style>
我尝试使用默认类型通过BasedOn继承样式,但如果自定义控件具有由其父级设置的显式样式,则它将无效。我也考虑过EventTriggers,但我不相信会有一个事件来初始化控件。
感谢任何人提供的任何帮助。 :)
答案 0 :(得分:22)
这里只是清楚术语:用户控件是一个派生自UserControl类的控件。如果我理解你,你从ToggleButton派生出来添加UncheckedContent和CheckedContent属性。在这种情况下,您已创建自定义控件。如果我们就通用术语达成一致,那么通常会更容易理解:)
据我所知,你不能在XAML中做这样的通用样式继承。您必须明确指定另一种样式所基于的样式。您的样式可以基于ToggleButton的默认样式,也可以基于特定的其他样式。如果你不能建立一个尊重它的样式继承链,这种方法将无法工作。
但是既然你有一个自定义控件,你不能为它编写一个基于默认切换按钮样式的默认样式吗?
<Style TargetType="{x:Type CustomToggleButton}"
BasedOn="{StaticResource {x:Type ToggleButton}}">
然后,只要将显式样式应用于切换按钮,就会指定它基于默认切换按钮样式。
此外,您可以为包含上述触发器的Themes \ Generic.xaml中的新切换按钮编写(默认)控件模板。在混合中,您可以获得切换按钮的默认模板的副本(“编辑模板” - >“编辑副本”),这样您就可以确保切换按钮看起来与普通切换按钮完全相同。然后将上面的触发器合并到该模板中。
BTW:您不必为了添加新属性而创建新控件。您可以使用attached properties向现有控件添加新属性。它们可以像普通属性一样在XAML中使用。