当前位置:编程学习 > C#/ASP.NET >>

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="300" Width="300" MouseDown="Button_MouseDown" PreviewMouseDown="button1_PreviewMouseDown">
    <Grid x:Name="grid1" MouseDown="Button_MouseDown" PreviewMouseDown="button1_PreviewMouseDown">
        <StackPanel Name="stackpanel1" MouseDown="Button_MouseDown" PreviewMouseDown="button1_PreviewMouseDown">
            <Button Height="30" Name="button1" Width="100" Content="点击我" MouseDown="Button_MouseDown" PreviewMouseDown="button1_PreviewMouseDown" />
        </StackPanel>
    </Grid>
</Window>


后台:


 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void Button_MouseDown(object sender, MouseButtonEventArgs e)
        {
            MessageBox.Show(sender.GetType().ToString());
        }
        private void button1_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            MessageBox.Show(sender.GetType().ToString());
        }
    }    



上面的代码,为每个元素定义了冒泡事件和隧道事件,为什么只有隧道事件引发了,冒泡事件没有引发,不是说隧道事件发生在冒泡事件之前的吗?冒泡事件也因该引发的啊? --------------------编程问答-------------------- 因为Button恰好对左键感兴趣
所以它“吞掉”了MouseDown并触发Click事件
你用右键就能看到MouseDown的冒泡了 --------------------编程问答--------------------
引用 1 楼 hhddzz 的回复:
因为Button恰好对左键感兴趣
所以它“吞掉”了MouseDown并触发Click事件
你用右键就能看到MouseDown的冒泡了

俺就是用的右键 --------------------编程问答--------------------
引用 2 楼 u010550137 的回复:
Quote: 引用 1 楼 hhddzz 的回复:

因为Button恰好对左键感兴趣
所以它“吞掉”了MouseDown并触发Click事件
你用右键就能看到MouseDown的冒泡了

俺就是用的右键

把MessageBox换成其他东西 --------------------编程问答--------------------
引用 3 楼 hhddzz 的回复:
Quote: 引用 2 楼 u010550137 的回复:

Quote: 引用 1 楼 hhddzz 的回复:

因为Button恰好对左键感兴趣
所以它“吞掉”了MouseDown并触发Click事件
你用右键就能看到MouseDown的冒泡了

俺就是用的右键

把MessageBox换成其他东西

这跟MessageBox有关系吗? --------------------编程问答--------------------
引用 4 楼 u010550137 的回复:
Quote: 引用 3 楼 hhddzz 的回复:

Quote: 引用 2 楼 u010550137 的回复:

Quote: 引用 1 楼 hhddzz 的回复:

因为Button恰好对左键感兴趣
所以它“吞掉”了MouseDown并触发Click事件
你用右键就能看到MouseDown的冒泡了

俺就是用的右键

把MessageBox换成其他东西

这跟MessageBox有关系吗?

你试试呗
我已经试过了
不过原因还没去考虑 --------------------编程问答-------------------- 有人知道原因吗? --------------------编程问答-------------------- 什么原因............ --------------------编程问答-------------------- 有人知道吗? --------------------编程问答-------------------- 顶,有人知道么? --------------------编程问答-------------------- 有人知道吗? --------------------编程问答-------------------- 有人知道吗? --------------------编程问答-------------------- 有人知道没? --------------------编程问答-------------------- 有人知道吗? --------------------编程问答-------------------- 有人知道吗?  --------------------编程问答-------------------- 有人知道吗?   --------------------编程问答-------------------- 有人知道吗?    --------------------编程问答-------------------- 有人知道,什么原因吗? --------------------编程问答-------------------- 有人知道没? --------------------编程问答-------------------- 大神,帮忙讲一下诶 --------------------编程问答-------------------- 有人知道没?  --------------------编程问答-------------------- 有人知道没?   --------------------编程问答-------------------- 有大神知道吗? --------------------编程问答-------------------- 有没有人知道啊?......................................... --------------------编程问答-------------------- 求解释 --------------------编程问答-------------------- 有人知道吗?
--------------------编程问答-------------------- 有人知道吗?
  --------------------编程问答-------------------- 有人知道吗? --------------------编程问答-------------------- 有人知道吗?  --------------------编程问答-------------------- 有人知道吗?   --------------------编程问答-------------------- 冒泡事件:简单的说就是子控件向父控件传递事件,如果window中的grid里放了一个canvas,当canvas中鼠标左键按下时,整个冒泡事件是怎么传递的:canvasLefeMouseDown处理完->gridLefeMouseDown处理完->windowLefeMouseDown处理完->结束冒泡;

隧道事件:一般都以Preview为开头,和冒泡事件相反,是父控件的事件传递到子空间,和上面一样的环境,当canvas中鼠标按下,整个隧道事件是如下传递:windowPreviewLefeMouseDown处理完->gridPreviewLefeMouseDown处理完->canvasPreviewLefeMouseDown处理完->结束;

明白了没有,至于为什么可以可以怎么传递,这和wpf界面技术有关,如果想在grid中中断事件的传递则在grid事件中:
private void grid_lefrmousedown(object sender, routedeventarge e)
{
    //处理代码。。。。
    ************
    //不再传递到下一个事件
    e.Handled = true;
} --------------------编程问答-------------------- 最简单的方法,就是你实际测试下就明白了,拖几个canvas嵌套,然后每个canvas都实现MouseLeftButtonDown和PreviewMouseLeftButton,每个事件里都MessageBox.Show("canvasName");

然后你就知道了。。。。 --------------------编程问答-------------------- 另外叠加控件也可以触发路由和隧道,这个不大好把握,整的来说,界面上谁处于谁的上面,谁就比谁早触发冒泡事件,隧道则相反; --------------------编程问答--------------------
引用 32 楼 viki117 的回复:
另外叠加控件也可以触发路由和隧道,这个不大好把握,整的来说,界面上谁处于谁的上面,谁就比谁早触发冒泡事件,隧道则相反;

这位朋友,没看我的问题吗?我的代码,冒泡事件没有激发啊,结果只弹了4次,应该8次的啊 --------------------编程问答-------------------- 有人知道,是什么原因吗? --------------------编程问答-------------------- 为什么用MessageBox,冒泡事件就没引发? --------------------编程问答-------------------- 为什么用MessageBox,冒泡事件就没引发?  --------------------编程问答-------------------- 为什么用MessageBox,冒泡事件就没引发? --------------------编程问答-------------------- 为什么用MessageBox,冒泡事件就没引发? 用其他方式,冒泡事件就引发了。 --------------------编程问答-------------------- 为什么用MessageBox,冒泡事件就没引发? 用其他方式,冒泡事件就引发了。  --------------------编程问答-------------------- 强迫在事件处理的时候引发了左键。 --------------------编程问答-------------------- 这个资源很好,我很喜欢~!!!!! --------------------编程问答--------------------
引用 40 楼 jinyuttt 的回复:
强迫在事件处理的时候引发了左键。

什么意思?详细点 --------------------编程问答-------------------- 隧道不能有"停顿",你打个断点和弹对话框都算,这个时候他就不知道往哪路由了。
比如你按钮外面有个grid,你注册了grid的previewmousedown事件,在里面打个断点,你会发现点按钮,按钮不触发click。
这是最常碰到的问题,类似的问题还有很多。 --------------------编程问答--------------------
引用 43 楼 nanqi0506 的回复:
隧道不能有"停顿",你打个断点和弹对话框都算,这个时候他就不知道往哪路由了。
比如你按钮外面有个grid,你注册了grid的previewmousedown事件,在里面打个断点,你会发现点按钮,按钮不触发click。
这是最常碰到的问题,类似的问题还有很多。

设置断点和弹对话框是不一样的吧,设置断点,代码根本就不会向后执行了,而对话框点"确定"之后,是应该继续执行的啊。
你说的隧道不能有"停顿",具体是什么规则呢,MSDN上都没说个这个事...... --------------------编程问答-------------------- 因为你用了messagebox,在wpf里面它也是个控件。而且是响应左键事件的控件。后面的引发同一楼回答,被吃掉了。 --------------------编程问答--------------------
引用 45 楼 jinyuttt 的回复:
因为你用了messagebox,在wpf里面它也是个控件。而且是响应左键事件的控件。后面的引发同一楼回答,被吃掉了。

一楼说的用右键能触发冒泡事件,但我就是用的右键啊,并没有触发。 --------------------编程问答--------------------
引用 43 楼 nanqi0506 的回复:
隧道不能有"停顿",你打个断点和弹对话框都算,这个时候他就不知道往哪路由了。
比如你按钮外面有个grid,你注册了grid的previewmousedown事件,在里面打个断点,你会发现点按钮,按钮不触发click。
这是最常碰到的问题,类似的问题还有很多。

如果仅仅是因为隧道不能有"停顿",那我取消messagebox,用Thread.Sleep(1000);停了1秒,为什么路由了呢? --------------------编程问答-------------------- 因为没有响应其他事件啊。事件不能停顿
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,