【问题标题】:Simplification of this XAML code possible? (MultiDataTrigger, DependencyProperty)可以简化此 XAML 代码吗? (MultiDataTrigger, DependencyProperty)
【发布时间】:2012-09-23 15:15:37
【问题描述】:

最后我得到了我的自定义按钮,几乎就像我想要的那样。
问题是代码:D(IsCheckedDependencyProperty

<ControlTemplate.Triggers>
            <!-- EventTriggers for LMBUp/LMBDown/MouseEnter/MouseLeave -->
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True"/>
                    <Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsChecked}" Value="False"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.EnterActions>
                    <BeginStoryboard Storyboard="{StaticResource MouseEnter}"/>
                </MultiDataTrigger.EnterActions>
                <MultiDataTrigger.ExitActions>
                    <BeginStoryboard Storyboard="{StaticResource MouseLeave}"/>
                </MultiDataTrigger.ExitActions>
            </MultiDataTrigger>                
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True"/>
                    <Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsChecked}" Value="True"/>
                </MultiDataTrigger.Conditions>
                <Setter TargetName="LayoutRoot" Property="Background" Value="Red"/>
            </MultiDataTrigger>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="False"/>
                    <Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsChecked}" Value="True"/>
                </MultiDataTrigger.Conditions>
                <Setter TargetName="LayoutRoot" Property="Background" Value="Red"/>
            </MultiDataTrigger>
        </ControlTemplate.Triggers>

我认为它有点“肮脏”,并且没有完全像预期的那样。 每次用户点击按钮IsChecked 时,都会从true 切换到false,反之亦然。 现在如果发生以下情况

  • IsChecked == 真
  • 用户单击将 IsChecked 切换为 false
  • 鼠标一直在按钮上

那么我希望按钮变成 $MouseOverColor$ 而不是 $ButtonNormalBackground$ 因为第一个 MultiDataTrigger

我的问题是是否可以简化代码并纠正最后一个问题?

提前致谢!

【问题讨论】:

    标签: c# wpf xaml binding triggers


    【解决方案1】:

    您可能有“价值解决策略”问题。 DependencyProperty 有一套解决值的策略,see here

    如果您的动画设置了 BackgroundLayoutRoot 的值,那么在您停止动画之前,其他设置器不会产生影响(在这种情况下,设置器被视为“本地值”)。

    您可以在第二个和第三个触发器的EnterActions 中使用&lt;StopStoryboard&gt; 元素。请注意,如果在触发器被激活时情节提要已经停止,这将在输出窗口中写入警告。

    --或者--

    您可以在情节提要中使用FillBehavior="Stop"

    【讨论】:

      猜你喜欢
      • 2011-05-27
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多