【问题标题】:WPF Multiple TriggersWPF 多个触发器
【发布时间】:2023-03-19 01:02:01
【问题描述】:

我在 isPressed 和 isMouseOver 之间有冲突的情节提要。两者都将按钮的背景更改为不同的颜色。但是 isMouseOver 故事板覆盖了 isPressed 故事板。我该如何克服这个?我听说过多个触发器,但你们能给我一个代码解决方案吗?我是 WPF 新手。

<ControlTemplate.Triggers>
    <Trigger Property="IsMouseOver" Value="True">
        <Trigger.EnterActions>
            <BeginStoryboard Storyboard="{StaticResource ToolsButtonMouseOver}"/>
        </Trigger.EnterActions>
        <Trigger.ExitActions>
            <BeginStoryboard x:Name="ToolsButtonMouseNotOver_BeginStoryboard" Storyboard="{StaticResource ToolsButtonMouseNotOver}"/>
        </Trigger.ExitActions>
    </Trigger>
    <Trigger Property="IsPressed" Value="True">
        <Trigger.ExitActions>
            <BeginStoryboard x:Name="ToolsButtonNotPressedStoryboard_BeginStoryboard1" Storyboard="{StaticResource ToolsButtonNotPressedStoryboard}"/>
        </Trigger.ExitActions>
        <Trigger.EnterActions>
            <BeginStoryboard x:Name="ToolsButtonNotPressedStoryboard_BeginStoryboard" Storyboard="{StaticResource ToolsButtonPressedStoryboard}"/>
        </Trigger.EnterActions>
    </Trigger>
</ControlTemplate.Triggers>

【问题讨论】:

  • 触发器在哪里? IsMouseOver 触发器是在 IsPressed 之后声明的吗?你试过换地方吗?如果这不起作用,请尝试使用visual states
  • 是的。我尝试交换 tem
  • 我已经添加了带有触发器的代码。鼠标悬停工作。但是一旦我按下按钮,isPress 工作,鼠标悬停不再工作
  • 您是否考虑过使用 MultiBinding 代替?然后你可以表达数据绑定何时生效的条件。

标签: wpf triggers storyboard


【解决方案1】:

当它是 IsMouseOver 和 IsPressed 时,您应该有多重触发器。另请注意,触发器的顺序也很重要。如果简单的 IsMouseOver 在多重触发之后,它将成为您悬停并按下时的活动条件。使用前景进行演示,因为它是演示效果的最简单方式。

<Button Content="Click Me">
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Foreground" Value="Black"/>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Foreground" Value="SpringGreen"/>
                </Trigger>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsMouseOver" Value="True"/>
                        <Condition Property="IsPressed" Value="True"/>
                    </MultiTrigger.Conditions>
                    <Setter Property="Foreground" Value="Blue"/>
                </MultiTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

【讨论】:

    【解决方案2】:

    考虑使用MultiDataTrigger

    这将使您能够表达特定条件,以便调用您的触发器之一。因此,这可能会在您的触发器之间提供互斥行为。

    例子:

    <MultiDataTrigger>
        <MultiDataTrigger.Conditions>
            <Condition Binding="{Binding Path=SomePath}" Value="SomeValue"/>
            <Condition Binding="{Binding Path=SomeOtherPath, Converter={StaticResource SomeConverter}}" Value="SomeOtherValue"/>
        </MultiDataTrigger.Conditions>
        <MultiDataTrigger.EnterActions>
            <BeginStoryboard Storyboard="{StaticResource MyStoryboard}"/>
        </MultiDataTrigger.EnterActions>
    </MultiDataTrigger>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多