San*_*olo 14 c# wpf mouseevent event-bubbling mousedown
我知道冒泡和隧道是如何工作的.但是,我对使用它们很困惑.原因如下:
我想处理鼠标点击事件.泡沫它,有,MouseDown并且,隧道,有PreviewMouseDown.但是,MouseDown并不一定意味着用户点击了控件.可能是用户按下按钮并离开它以取消点击.如果没有点击按钮,我不想改变任何东西.
所以我的问题是,Bubbling/Tunneling策略有用吗?
如果列出了该事件RoutedEventArgs,那么它就是路由事件.路由事件支持Bubble,Tunnel或Direct的RoutingStrategy.让我们来看看事件处理程序Button.Click:
private void Grid_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Button Test clicked!");
}
Run Code Online (Sandbox Code Playgroud)
有指定RoutedEventArgs,所以它是路由事件.因为未在名称中指定预览,因此这个Bubble事件.这可以通过以下方式证明:
<Grid ButtonBase.Click="Grid_Click">
<Button Name="TestButton" Width="100" Height="30" Content="Test" />
</Grid>
Run Code Online (Sandbox Code Playgroud)
单击时TestButton,事件将超出Grid,并显示一条消息:
按钮测试点击!
Usefulness of Bubbling/Tunneling strategies
Tunneling
许多标准控件的监听事件,如KeyDown,MouseDown等.例如- DataGrid控制.我想按下回车键,该功能被称为添加记录.但DataGrid已经有KeyDown事件,所以事件没有提出.所以你必须在隧道事件中做你的逻辑 - PreviewKeyDown它会在KeyDown事件之前工作.这同样适用于RichTextBoxControl.
Bubbling
有时,您需要一个特定事件的全局处理程序,因此它适用于VisualTree中的所有控件.当然,直接的事件你不能这样做.因此在舞台上出现Bubbling事件.
另一个原因是WPF的意识形态.这Button可以包含任何东西:Image,另一个Button,等等:

用户可以点击TextBlock/Image中Button.我们怎么知道点击进入Button?这是正确的,在Bubbling活动的帮助下.
有关更多信息,请参阅:
Edit
我改变了一点Click处理程序:
private void Grid_Click(object sender, RoutedEventArgs e)
{
String message = "#" + eventCounter.ToString() + ":\r\n" +
" Sender: " + sender.ToString() + ":\r\n" +
" Source: " + e.Source + ":\r\n" +
" Original Source: " + e.OriginalSource;
lstEvents.Items.Add(message);
}
Run Code Online (Sandbox Code Playgroud)
结果点击Button:
