Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF触发器影响代码中设置的值,而不是XAML_C#_Wpf_Triggers_Effects - Fatal编程技术网

C# WPF触发器影响代码中设置的值,而不是XAML

C# WPF触发器影响代码中设置的值,而不是XAML,c#,wpf,triggers,effects,C#,Wpf,Triggers,Effects,在我的应用程序中,我有三种可能状态的切换按钮;“未检查”、“已检查”和“以前使用过”。当用户进入此特定屏幕时,一些切换按钮将处于“以前使用”状态,以显示已完成的工作。单击切换按钮(无论当前状态如何)将使其处于“选中”状态。一次只能检查其中一个切换按钮。不同的状态由不同颜色的外部辉光表示,或者根本没有辉光 要将外部辉光设置为“已检查”状态,我使用IsChecked euqals true上的触发器 <ControlTemplate.Triggers> <Trigger Pr

在我的应用程序中,我有三种可能状态的切换按钮;“未检查”、“已检查”和“以前使用过”。当用户进入此特定屏幕时,一些切换按钮将处于“以前使用”状态,以显示已完成的工作。单击切换按钮(无论当前状态如何)将使其处于“选中”状态。一次只能检查其中一个切换按钮。不同的状态由不同颜色的外部辉光表示,或者根本没有辉光

要将外部辉光设置为“已检查”状态,我使用IsChecked euqals true上的触发器

<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 );