【问题标题】:WPF triggers affecting values set in code, not XAMLWPF 触发器影响代码中设置的值,而不是 XAML
【发布时间】:2009-08-07 21:58:54
【问题描述】:

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

要设置“已检查”状态的外发光,我在 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 中未设置的内容吗?

【问题讨论】:

  • 设置效果的代码什么时候运行?我怀疑发生的情况是您的触发器被应用,然后您的代码运行并覆盖了效果。
  • 我的代码在屏幕第一次出现时运行。仅当用户单击其中一个按钮时才会应用触发器。因此,触发器不应该被覆盖。
  • @Dan:Pavel 表示您的ControlTemplate 触发器正在被覆盖。一个更好的词会被压制。在代码中设置Effect 是设置本地值。阅读:wpftutorial.net/DependencyProperties.html

标签: c# wpf triggers effects


【解决方案1】:

Button 上设置DropShadowEffect 后,您将设置ButtonEffect 属性的本地值,即DependencyProperty (Button.EffectProperty)。本地值会覆盖任何其他可能的值,直到它被这样清除:

button1.ClearValue( Button.EffectProperty );

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

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

您必须连接的部分是绑定,您可能必须在某处使用IValueConvertermViews[i].LocalizedName 转换为truefalse for PreviouslyUsed

不幸的是,我对您使用mViews 的设置了解不多,因此无法提供更多建议。我不知道您的ToggleButtons 是否属于数据绑定的一部分。我怀疑它们不是,因为您似乎正在迭代它们的数组。例如,如果您将mViews 对象绑定到ListBoxItemsSource,您可以创建一个DataTemplate 来生成ToggleButtons,而AttachedProperty 已经就位。这也将简化您的IsChecked 情况,方法是将其绑定到是否在ListBox 中选择了该项目,然后ListBox 负责确保只选择一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-29
    • 2018-01-28
    • 1970-01-01
    • 2011-09-30
    • 2010-11-09
    • 2014-10-28
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多