我想知道是否有办法观察WPF应用程序中引发的所有RoutedEvent.写一些关于向控制台发起的事件的信息的方法将是完美的,看看发生了什么.
我是WPF的新手.我试图理解MouseDownEvent和PreviewMouseDownEvent之间的区别.
我理解WPF事件策略,我理解MouseDown事件是一个冒泡事件,PreviewMouseDown是一个隧道事件.
我也理解这些事件被触发的顺序 - 根据MSDN概述http://msdn.microsoft.com/en-us/library/ms742806.aspx#routing(这里有一个示例图).
所以我试着编写一些自己的代码,例如检查一下:
<Grid x:Name="grid" Width="250">
<StackPanel Mouse.MouseDown="StackPanel_MouseDown" PreviewMouseDown="StackPanel_PreviewMouseDown">
<WPFVisualizerExample:MyButton x:Name="B1" PreviewMouseDown="B1_PreviewMouseDown" MouseDown="B1_MouseDown" Margin="5,5,5,5">
<WPFVisualizerExample:MyButton x:Name="B2" PreviewMouseDown="B2_PreviewMouseDown" MouseDown="B2_MouseDown" Margin="5,5,5,5">
<WPFVisualizerExample:MyButton x:Name="B3" PreviewMouseDown="B3_PreviewMouseDown" MouseDown="B3_MouseDown" Margin="5,5,5,5">Click Me</WPFVisualizerExample:MyButton>
</WPFVisualizerExample:MyButton>
</WPFVisualizerExample:MyButton>
</StackPanel>
</Grid>
Run Code Online (Sandbox Code Playgroud)
我为每个事件(预览和非预览)都有一个事件处理程序,我想看看发生了什么,抛出了哪个事件(我为每个事件显示了一个消息框).
'MyButton'用户控件只是扩展基本Button并覆盖OnMouseDown和OnPreviewMouseDown来设置e.Handled false:
protected override void OnMouseDown(System.Windows.Input.MouseButtonEventArgs e)
{
base.OnMouseDown(e);
e.Handled = false;
}
protected override void OnPreviewMouseDown(System.Windows.Input.MouseButtonEventArgs e)
{
base.OnPreviewMouseDown(e);
e.Handled = false;
}
Run Code Online (Sandbox Code Playgroud)
(试过这个,没有这个).
根据MSDN概述(在上面的链接中),如果我有3个元素,那么事件路由应该如下:
根元素上的PreviewMouseDown(隧道).
中间元素#1上的PreviewMouseDown(隧道).
源元素#2上的PreviewMouseDown(隧道).
源元素#2上的MouseDown(气泡).
MouseDown(气泡)在中间元素#1上.
根元素上的MouseDown(气泡).
所以我希望根据上面的内容显示消息框.出于某种原因 - 我不明白只会抛出预览事件(根据MSDN所说的Preview_B1 => Preview_B2 => Preview_B3).我的期望是:Preview_B1 => Preview_B2 …