Ada*_*oll 12 wpf events button mouseleftbuttonup
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>
Run Code Online (Sandbox Code Playgroud)
我知道这很可能很简单.谢谢您的帮助!
Job*_*Joy 25
看起来像Button控件正在吃掉那个事件因为Button.Click实际上是LeftButtonDown事件和LeftButtonUp事件的组合.
但是您可以在Button上订阅Tunnelled事件PreviewMouseLeftButtonUp以获取LeftButtonUp
订阅隧道事件而不是气泡事件会产生一些非常混乱的副作用,我将在稍后解释。
这是一个更好的解决方案,因为它可以保持气泡完好无损。:)
btnNewConfig.AddHandler(MouseLeftButtonUpEvent,
new RoutedEventHandler(btnNewConfig_MouseUp),
true);
Run Code Online (Sandbox Code Playgroud)
您必须使用RoutedEventArgs而不是声明您的事件处理程序MouseButtonEventArgs,但您可以将其强制转换回MouseButtonEventArgs内部。
void btnNewConfig_MouseUp(object sender, RoutedEventArgs e)
{
MouseButtonEventArgs args = e as MouseButtonEventArgs;
// ...
}
Run Code Online (Sandbox Code Playgroud)
请注意 - 使其为 true 中的最后一个参数AddHandler会导致事件触发,即使先前的处理程序已设置e.Handled = true;
现在关于PreviewMouseLeftButtonUp:
隧道事故先是先为父母着火,后为儿童着火。冒泡——相反。如果涉及许多事件处理程序,您应该真正坚持所有冒泡或所有隧道,否则您添加的事件处理程序越多,它就会变得越混乱 - 添加一个新的事件处理程序可能会导致您重新访问应用程序中的所有其他事件处理程序。
大多数人发现冒泡模型是一种更自然的模型。这就是为什么接受的答案是有问题的。