日期:2014-05-17  浏览次数:21327 次

WPF,路由事件的困惑

<Window x:Class="WPF熊俊.MainWindow"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="308" Width="552" >
    <Grid Height="202" Name="grid1" Width="325" MouseDown ="button1_MouseDown" PreviewMouseDown="button1_PreviewMouseDown">
        <Button Height="23" Name="button1" Width="75" MouseDown="button1_MouseDown" PreviewMouseDown="button1_PreviewMouseDown">button1</Button>        
    </Grid>
</Window>



public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    private void button1_MouseDown(object sender, MouseButtonEventArgs e)
    {
        MessageBox.Show("MouseDown");
    }
    private void button1_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        MessageBox.Show("PreviewMouseDown");
    }
}    

给Grid和Button都注册了冒泡事件和隧道事件。当用鼠标右键(注意,是右键)点击button的时候,为什么只弹出了2次"PreviewMouseDown",而没有弹出"MouseDown",这就是说为什么冒泡事件没有触发呢?
困惑的是,如果不用MessageBox.Show,而是用一个变量来记录冒泡事件和隧道事件触发的次数,结果却正好是4次,那说明隧道事件和冒泡事件都引发了。为什么用MessageBox.Show,冒泡事件就不引发了?

谢谢!!

------解决方案--------------------
我试了一下换成变量,也尝试了断点,甚至只注册MOUSEDOWN,但MOUSEDOWN并没有被触发,不明真相
------解决方案--------------------
请不要以MessageBox.Show("PreviewMouseDown");调试,这样的话,button1_PreviewMouseDown事件执行后,焦点就不在窗体上,而是在MessageBox上了,你看不出事件要走的流程,wpf你可以通过一个全局string来看事件是怎么执行的
------解决方案--------------------

------解决方案--------------------
同意焦点说   。。。