WPF中的奇怪事件......当我将事件设置为MouseUp时,我可以在右键单击按钮时触发它。但这不会随着点击而触发!
<Button MouseLeftButtonUp="btnNewConfig_MouseUp" Name="btnNewConfig">
<StackPanel Orientation="Horizontal">
<Image Source="Icons\new.ico" Height="24" Width="24" Margin="5"/>
<TextBlock VerticalAlignment="Center">New</TextBlock>
</StackPanel>
</Button>
我知道这很可能很简单。谢谢你的帮助!
答案 0 :(得分:25)
看起来Button控件正在吃掉那个事件因为Button.Click实际上是LeftButtonDown事件和LeftButtonUp事件的组合。
但您可以订阅Button上的Tunnelled事件 PreviewMouseLeftButtonUp 以获取LeftButtonUp
答案 1 :(得分:2)
Button正在使用MouseLeft / RightButtonUp / Down事件(并将其标记为“Handled”)作为其Button.Click事件。
正如Jobi所说,您可以使用PreviewMouseLeftButtonUp事件,但我想建议您创建自己的按钮模板并修改其行为。 (即不将MouseLeftButtonUp标记为Handled = true)或仅使用除按钮之外的其他内容作为父容器。 (取决于你真正需要它的东西)。
答案 2 :(得分:1)
订阅隧道事件而不是泡泡,我会在稍后解释一些非常混乱的副作用。
这是一个更好的解决方案,因为它可以保持泡泡完好无损。 :)
btnNewConfig.AddHandler(MouseLeftButtonUpEvent,
new RoutedEventHandler(btnNewConfig_MouseUp),
true);
您必须使用RoutedEventArgs而不是MouseButtonEventArgs声明您的事件处理程序,但您可以将其转换回内部的MouseButtonEventArgs。
void btnNewConfig_MouseUp(object sender, RoutedEventArgs e)
{
MouseButtonEventArgs args = e as MouseButtonEventArgs;
注意AddHandler中的最后一个参数 - 使其成为true会导致事件触发,即使先前的处理程序设置为e.Handled = true;
现在关于PreviewMouseLeftButtonUp:
在孩子面前,父母会为父母开火。冒泡 - 相反。
如果涉及到许多事件处理程序,你应该坚持所有冒泡或所有隧道,否则你添加的事件处理程序越多,它就越混乱 - 添加一个新的事件处理程序可能会导致你重新访问应用程序中的所有其他事件处理程序。登记/>
大多数人发现冒泡模型更自然。
这就是为什么接受的答案有问题。