我正在阅读路由事件,顺便说一下这是非常酷的概念,我理解事件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...");
}
在事件冒泡正确消息框中显示从buttonClick
到WindowClick
但在PreviewKeyup
中不同的情况。有人可以向我解释一下我的例子中的事件隧道是如何工作的吗?
答案 0 :(得分:1)
你想尝试隧道是一种棘手的方式。如果您在窗口中,我认为您按下向上按钮,而不是仅从窗口获取消息。就是这样,因为你按下窗口上的向上按钮(窗口是激活控件),事件来自窗口的路径并停在窗口,因为它是启动事件的叶元素。尝试先点击&#34;点击我&#34;按钮,然后你将焦点放在按钮上,然后按向上键。它将从窗口穿过网格到达按钮,您将获得所需的所有消息。