C# WPF触发器影响代码中设置的值,而不是XAML
在我的应用程序中,我有三种可能状态的切换按钮;“未检查”、“已检查”和“以前使用过”。当用户进入此特定屏幕时,一些切换按钮将处于“以前使用”状态,以显示已完成的工作。单击切换按钮(无论当前状态如何)将使其处于“选中”状态。一次只能检查其中一个切换按钮。不同的状态由不同颜色的外部辉光表示,或者根本没有辉光 要将外部辉光设置为“已检查”状态,我使用IsChecked euqals true上的触发器C# WPF触发器影响代码中设置的值,而不是XAML,c#,wpf,triggers,effects,C#,Wpf,Triggers,Effects,在我的应用程序中,我有三种可能状态的切换按钮;“未检查”、“已检查”和“以前使用过”。当用户进入此特定屏幕时,一些切换按钮将处于“以前使用”状态,以显示已完成的工作。单击切换按钮(无论当前状态如何)将使其处于“选中”状态。一次只能检查其中一个切换按钮。不同的状态由不同颜色的外部辉光表示,或者根本没有辉光 要将外部辉光设置为“已检查”状态,我使用IsChecked euqals true上的触发器 <ControlTemplate.Triggers> <Trigger Pr
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Effect">
<Setter.Value>
<DropShadowEffect Color="Salmon" BlurRadius="40" ShadowDepth="0" Opacity="1.0"></DropShadowEffect>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
但是,当在“先前使用”状态下单击切换按钮时,触发器似乎没有任何效果。外部辉光不会改变
我做错了什么?触发器不会影响未在XAML中设置的内容吗?一旦您在
按钮上设置DropShadowEffect
,您将设置按钮的效果
属性的本地值,该属性是依赖属性(按钮.EffectProperty
)。本地值将覆盖任何其他可能的值,直到按如下方式清除该值:
button1.ClearValue( Button.EffectProperty );
然而,这只会使工作更加复杂,因为如果之前设置过,但尚未清除,您还必须确保清除它
相反,您可以创建一个以前使用的AttachedProperty
,以打开切换按钮
,并使用绑定
,这样它们的值会更自动。然后在触发器中引用此AttachedProperty值,您将为以前使用的设置一个下拉阴影,为选中的设置另一个下拉阴影
您需要连接的部分是绑定,您可能需要在某个地方使用IValueConverter
来将mViews[i].LocalizedName
转换为true
或false
,用于以前使用的
不幸的是,我对您使用mViews
等工具的设置了解不够,无法提供更多建议。我不知道您的切换按钮是否是数据绑定的一部分。我怀疑它们不是,因为您似乎正在迭代它们的数组。例如,如果将mViews
对象绑定到ListBox
的ItemsSource
,则可以创建一个DataTemplate
,该模板生成带有AttachedProperty的ToggleButtons
。这也将简化您的IsChecked
情况,将其绑定到ListBox
中是否选择了该项,然后ListBox
将负责确保只选择一项。设置效果的代码何时运行?我怀疑你的触发器被应用了,然后你的代码运行并覆盖了效果。我的代码在屏幕第一次出现时运行。只有当用户单击其中一个按钮时,才会应用触发器。所以触发器不应该被覆盖。@Dan:Pavel表示您的ControlTemplate
触发器被覆盖。一个更好的词将被压制。在代码中设置效果
就是设置局部值。请阅读以下内容:
button1.ClearValue( Button.EffectProperty );