WPF触发器影响在代码中设置值,而不是XAML
题
在我的应用程序我有有三种可能的状态切换按钮; “未”,“检查”和“先前使用的”。当用户来到这个特殊的屏幕,一些切换按钮将在“先前使用的”状态显示已经做了哪些工作。点击切换按钮(无论当前状态),将其放置到“选中”状态。只有这些切换按钮中的一个可以在同一时间进行检查。不同的状态由不同颜色的外发光,或根本没有发光的所有指示。
要设置外发光的“选中”状态我使用上一个器isChecked触发euqals真。
<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>
有关的“之前使用的”状态I应用在代码外发光,而不是标记。我必须这样做,因为确定按钮应该是在这种状态下通过在列表检查值来实现。
if (mExistingViews.Contains(mViews[i].LocalizedName))
{
DropShadowEffect dse = new DropShadowEffect();
dse.ShadowDepth = 0;
dse.BlurRadius = 20;
dse.Opacity = 1.0;
dse.Color = Colors.Yellow;
mViewButtons[i].Effect = dse;
}
然而,当切换按钮被点击时在“之前使用”的状态,触发似乎不产生任何影响。外发光不会改变。
我在做什么错了?将触发没有影响的东西,还没有在XAML中设置?
解决方案
一旦设置在DropShadowEffect
的Button
,您正在设置Button
的Effect
属性,这是一个DependencyProperty
(Button.EffectProperty
)的局部值。直到它被这样清除本地值将覆盖任何其它可能的值:
button1.ClearValue( Button.EffectProperty );
不过,这只是使运作更令人费解的一点,因为你还必须确保你清楚,如果是前设置和尚未清除。
相反,你可以创建一个AttachedProperty PreviouslyUsed
穿上ToggleButton
s和使用Bindings
让他们得到他们的价值多一些自动的。然后,参照本AttachedProperty值在你的触发器,你就会有一个PreviouslyUsed
阴影,另一个用于IsChecked
。
你必须要连接的部分是绑定的,你可能不得不使用IValueConverter
地方把mViews[i].LocalizedName
成true
或false
为PreviouslyUsed
。
不幸的是,我不知道有足够的了解您的设置与mViews
和这样提供有关更多的建议。我不知道你的ToggleButtons
是否绑定与否的一部分。我怀疑他们是不是像你似乎中将其中的数组。如果您绑定的对象mViews
的ItemsSource
的ListBox
,例如,你可以创建已生成的地方与AttachedProperty的DataTemplate
一个ToggleButtons
。这也将通过其绑定到该项目是否在IsChecked
选择简化ListBox
情况,然后采取ListBox
确保只有一个被选中的照顾。