何时隧道和冒泡事件在WPF中有用?

San*_*olo 14 c# wpf mouseevent event-bubbling mousedown

我知道冒泡和隧道是如何工作的.但是,我对使用它们很困惑.原因如下:

我想处理鼠标点击事件.泡沫它,有,MouseDown并且,隧道,有PreviewMouseDown.但是,MouseDown并不一定意味着用户点击了控件.可能是用户按下按钮并离开它以取消点击.如果没有点击按钮,我不想改变任何东西.

所以我的问题是,Bubbling/Tunneling策略有用吗?

Ana*_*aev 8

如果列出了该事件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/ImageButton.我们怎么知道点击进入Button?这是正确的,在Bubbling活动的帮助下.

有关更多信息,请参阅:

了解WPF中的路由事件和命令

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:

在此输入图像描述