0

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

为了设置“Checked”状态的外发光,我在 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>

对于“以前使用”状态,我在代码中应用外发光,而不是标记。我必须这样做,因为确定按钮是否应处于此状态是通过检查列表中的值来完成的。

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 中未设置的内容吗?

4

1 回答 1

2

一旦在DropShadowEffect上设置 ,您就是在设置'属性Button的本地值,即( )。本地值会覆盖任何其他可能的值,直到它像这样被清除:ButtonEffectDependencyPropertyButton.EffectProperty

button1.ClearValue( Button.EffectProperty );

但是,这只会使工作更加复杂,因为如果之前设置过并且尚未清除,您还必须确保清除它。

相反,您可以创建一个 AttachedPropertyPreviouslyUsed放在ToggleButtons 上并使用Bindings,以便它们更自动地获得它们的值。然后在您的触发器中引用这个 AttachedProperty 值,您将有一个阴影用于PreviouslyUsed,另一个用于IsChecked

您必须连接的部分是绑定,您可能必须使用IValueConverter某处mViews[i].LocalizedName变成 atruefalsefor PreviouslyUsed

不幸的是,我对您的设置知之甚少mViews,因此无法提供更多建议。我不知道你是否ToggleButtons是数据绑定的一部分。我怀疑它们不是,因为您似乎正在迭代它们的数组。例如,如果您将mViews对象绑定到ItemsSourcea ListBox,您可以创建一个DataTemplate生成ToggleButtonsAttachedProperty 已经到位的 a 。这也可以IsChecked通过将它绑定到是否在 中选择了该项目来简化您的情况ListBox,然后ListBox确保只选择一个项目。

于 2009-08-07T00:19:27.097 回答