为什么 IsPressedChanged 事件不适用于交互触发器但其他事件可以?
Why does the IsPressedChanged event not work with an interaction trigger but other events do?
编辑: 简而言之:正如 AFigmentOfMyImagination 在他的回答中指出的那样,不存在 IsPressedChanged
事件。但是,这是原始问题:
我有一个按钮,我希望在按下按钮和释放按钮时都执行一个命令。按钮的标准命令绑定只能在按下或释放按钮时调用命令,所以我想我可能会在 IsPressedChanged
事件上使用交互触发器来实现我想要的,如下所示:
<Button xmlns:i="http://schemas.microsoft.com/xaml/behaviors">
<i:Interaction.Triggers>
<i:EventTrigger EventName="IsPressedChanged">
<i:InvokeCommandAction Command="{Binding Path=SomeCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
但这不起作用。但是,当我使用 MouseEnter
事件等其他事件时,它确实有效。
现在我的问题是,这是为什么? IsPressedChanged
事件和其他事件有什么区别?在我看来好像存在一些概念上的差异,我想知道那是什么(也许为什么需要有所不同)。
编辑: 我找到了一种方法,可以在每次 IsPressed
更改时执行命令。 .
中使用了该解决方案
IsPressedChanged
和MouseEvent
的区别在于MouseEvent
是Button
提供的事件,而IsPressedChanged
不是。
换句话说,不存在的东西不可能真正“起作用”...
EventTrigger 用于路由事件。
没有 IsPressedChanged
路由事件,Button
提供的唯一路由事件是 Click,它不符合您的需求。
在global routed events中,你可以找到Mouse.MouseDown
和Mouse.MouseUp
,但你会错过通过键盘按下按钮的情况。
您可以通过数据触发器使用 Button.IsPressed
属性 并将绑定源设置为按钮(通过使用 ElementName or RelativeSource)。
但是你必须 bodge 它一点,所以如果值为 true
或 false
.
它就会触发
幸运的是,true
或 false
都不等于空字符串。通过将 DataTrigger.Comparison
设置为 "NotEqual"
并将 Value
设置为 ""
,您可以确保每次 IsPressed
更改时触发触发器。
(一个可能的不良影响:它在创建控件后立即触发。)
<Button x:Name="Button">
<i:Interaction.Triggers>
<!--
You can also use this binding
<i:DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Button},
Path=IsPressed}"
-->
<i:DataTrigger Binding="{Binding ElementName=Button, Path=IsPressed}"
Comparison="NotEqual"
Value="">
<i:InvokeCommandAction Command="{Binding Path=PressedChangedCommand}"/>
</i:DataTrigger>
</i:Interaction.Triggers>
</Button>
可用的工作演示 here。
编辑: 简而言之:正如 AFigmentOfMyImagination 在他的回答中指出的那样,不存在 IsPressedChanged
事件。但是,这是原始问题:
我有一个按钮,我希望在按下按钮和释放按钮时都执行一个命令。按钮的标准命令绑定只能在按下或释放按钮时调用命令,所以我想我可能会在 IsPressedChanged
事件上使用交互触发器来实现我想要的,如下所示:
<Button xmlns:i="http://schemas.microsoft.com/xaml/behaviors">
<i:Interaction.Triggers>
<i:EventTrigger EventName="IsPressedChanged">
<i:InvokeCommandAction Command="{Binding Path=SomeCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
但这不起作用。但是,当我使用 MouseEnter
事件等其他事件时,它确实有效。
现在我的问题是,这是为什么? IsPressedChanged
事件和其他事件有什么区别?在我看来好像存在一些概念上的差异,我想知道那是什么(也许为什么需要有所不同)。
编辑: 我找到了一种方法,可以在每次 IsPressed
更改时执行命令。
IsPressedChanged
和MouseEvent
的区别在于MouseEvent
是Button
提供的事件,而IsPressedChanged
不是。
换句话说,不存在的东西不可能真正“起作用”...
EventTrigger 用于路由事件。
没有 IsPressedChanged
路由事件,Button
提供的唯一路由事件是 Click,它不符合您的需求。
在global routed events中,你可以找到Mouse.MouseDown
和Mouse.MouseUp
,但你会错过通过键盘按下按钮的情况。
您可以通过数据触发器使用 Button.IsPressed
属性 并将绑定源设置为按钮(通过使用 ElementName or RelativeSource)。
但是你必须 bodge 它一点,所以如果值为 true
或 false
.
它就会触发
幸运的是,true
或 false
都不等于空字符串。通过将 DataTrigger.Comparison
设置为 "NotEqual"
并将 Value
设置为 ""
,您可以确保每次 IsPressed
更改时触发触发器。
(一个可能的不良影响:它在创建控件后立即触发。)
<Button x:Name="Button">
<i:Interaction.Triggers>
<!--
You can also use this binding
<i:DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Button},
Path=IsPressed}"
-->
<i:DataTrigger Binding="{Binding ElementName=Button, Path=IsPressed}"
Comparison="NotEqual"
Value="">
<i:InvokeCommandAction Command="{Binding Path=PressedChangedCommand}"/>
</i:DataTrigger>
</i:Interaction.Triggers>
</Button>
可用的工作演示 here。