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

Ste*_*der 18 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>
Run Code Online (Sandbox Code Playgroud)

我尝试使用默认类型通过BasedOn继承样式,但如果自定义控件具有由其父级设置的显式样式,则它将无法工作.我也考虑过EventTriggers,但我不相信会有一个事件来初始化控件.

感谢任何人都能提供的帮助.:)

bit*_*onk 22

只是为了清楚这里的术语:用户控件是一个从UserControl类派生的控件.如果我理解你,你从ToggleButton派生出来添加UncheckedContent和CheckedContent属性.在这种情况下,您已创建自定义控件.如果我们就通用术语达成一致,那么通常会更容易理解:)

据我所知,你不能在XAML中做这样的通用样式继承.您必须明确指定另一种样式所基于的样式.您的样式可以基于ToggleButton的默认样式,也可以基于特定的其他样式.如果你不能建立一个尊重它的样式继承链,这种方法将无法工作.

但是既然你有一个自定义控件,你不能为它编写一个基于默认切换按钮样式的默认样式吗?

<Style TargetType="{x:Type CustomToggleButton}" 
       BasedOn="{StaticResource {x:Type ToggleButton}}">
Run Code Online (Sandbox Code Playgroud)

然后,只要将显式样式应用于切换按钮,就会指定它基于默认切换按钮样式.

您还可以为包含上述触发器的Themes\Generic.xaml中的新切换按钮编写(默认)控件模板.在混合中,您可以获得切换按钮的默认模板的副本("编辑模板" - >"编辑副本"),这样您就可以确保切换按钮看起来与普通切换按钮完全相同.然后将上面的触发器合并到该模板中.

顺便说一句:您不必为了添加新属性而创建新控件.您可以使用附加属性向现有控件添加新属性.它们可以像普通属性一样在XAML中使用.

  • 你介意发布一些你所做的细节吗?我想做同样的事情。 (3认同)