可以简化这个XAML代码吗? (MultiDataTrigger,DependencyProperty)

时间:2012-09-23 15:15:37

标签: c# wpf xaml binding triggers

最后我的自定义按钮几乎就像我希望它行动一样 问题是代码: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 == true
  • 用户点击将IsChecked切换为false
  • 鼠标按下按钮
  • 的所有时间

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

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

提前致谢!

1 个答案:

答案 0 :(得分:0)

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

如果您的动画设置了Background LayoutRoot的值,那么在停止动画之前其他设置器将不起作用(在这种情况下,设置器被视为“本地值”)。

您可以在<StopStoryboard>第二个和第三个触发器中使用EnterActions元素。请注意,如果在激活触发器时故事板已经停止,则会在输出窗口中写入警告。

- 可选地 -

您可以在故事板中使用FillBehavior="Stop"