事件隧道如何在WPF中工作?

时间:2013-02-05 08:32:18

标签: wpf routed-events

我正在阅读路由事件,顺便说一下这是非常酷的概念,我理解事件Bubbling如何从子元素到根元素工作,但我不确定事件隧道如何工作。我创建了一个小例子,我在网格中放了一个按钮并将previewKeyup事件附加到所有按钮事件,但是按下按键事件后,在根级别处理,而不是通过隧道传输到子节点。

<Window x:Class="ExplorerContentControl.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Content Control" Height="400" Width="400" FontFamily="Calibri" FontSize="13" FontWeight="Bold" Button.Click ="Window_Click" PreviewKeyUp="Window_PreviewKeyUp" >
    <Grid Button.Click ="Grid_Click" PreviewKeyUp="Grid_PreviewKeyUp">
        <Button Name="btnClickedMe" Click="btnClickedMe_Click" Margin="3" HorizontalAlignment="Left" Height="25" Width="80" Content="Click Me" PreviewKeyUp="btnClickedMe_PreviewKeyUp" />
    </Grid>
</Window>

在Code背后

private void btnClickedMe_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("From Btn Clicked");
}

private void Grid_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("at Grid Location...");
}

private void Window_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("at Windows Location ...");
}

private void Window_PreviewKeyUp(object sender, KeyEventArgs e)
{
    MessageBox.Show("PreviewKeyUp From Windows...");
}

private void Grid_PreviewKeyUp(object sender, KeyEventArgs e)
{
    MessageBox.Show("PreviewKeyUp From Grid...");
}

private void btnClickedMe_PreviewKeyUp(object sender, KeyEventArgs e)
{
    MessageBox.Show("PreviewKeyUp From Button...");
}

在事件冒泡正确消息框中显示从buttonClickWindowClick但在PreviewKeyup中不同的情况。有人可以向我解释一下我的例子中的事件隧道是如何工作的吗?

1 个答案:

答案 0 :(得分:1)

你想尝试隧道是一种棘手的方式。如果您在窗口中,我认为您按下向上按钮,而不是仅从窗口获取消息。就是这样,因为你按下窗口上的向上按钮(窗口是激活控件),事件来自窗口的路径并停在窗口,因为它是启动事件的叶元素。尝试先点击&#34;点击我&#34;按钮,然后你将焦点放在按钮上,然后按向上键。它将从窗口穿过网格到达按钮,您将获得所需的所有消息。