gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:49:20 27 4
gpt4 key购买 nike

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

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

最佳答案

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

据我所知,您不能在 XAML 中执行此类通用样式继承。您始终必须明确指定另一种样式所基于的样式。您的样式可以基于 ToggleButton 的默认样式或特定的其他样式。如果你不能建立一个尊重它的风格继承链,这种方法就不会奏效。

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

<Style TargetType="{x:Type CustomToggleButton}" 
BasedOn="{StaticResource {x:Type ToggleButton}}">

然后,每当您将显式样式应用于切换按钮时,您将指定它基于默认切换按钮样式。

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

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

关于c# - 如何在不覆盖现有样式的情况下向 WPF 自定义控件添加触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1495298/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com