如何在不覆盖现有样式的情况下向WPF自定义控件添加触发器?

时间:2009-09-29 22:32:36

标签: c# wpf triggers styles

我正在创建一个从切换按钮扩展的简单自定义控件,允许用户直接在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,但我不相信会有一个事件来初始化控件。

感谢任何人提供的任何帮助。 :)

1 个答案:

答案 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中使用。