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的冒泡了 --------------------编程问答--------------------
俺就是用的右键 --------------------编程问答--------------------
把MessageBox换成其他东西 --------------------编程问答--------------------
因为Button恰好对左键感兴趣
所以它“吞掉”了MouseDown并触发Click事件
你用右键就能看到MouseDown的冒泡了
俺就是用的右键
把MessageBox换成其他东西
这跟MessageBox有关系吗? --------------------编程问答--------------------
因为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");
然后你就知道了。。。。 --------------------编程问答-------------------- 另外叠加控件也可以触发路由和隧道,这个不大好把握,整的来说,界面上谁处于谁的上面,谁就比谁早触发冒泡事件,隧道则相反; --------------------编程问答--------------------
另外叠加控件也可以触发路由和隧道,这个不大好把握,整的来说,界面上谁处于谁的上面,谁就比谁早触发冒泡事件,隧道则相反;
这位朋友,没看我的问题吗?我的代码,冒泡事件没有激发啊,结果只弹了4次,应该8次的啊 --------------------编程问答-------------------- 有人知道,是什么原因吗? --------------------编程问答-------------------- 为什么用MessageBox,冒泡事件就没引发? --------------------编程问答-------------------- 为什么用MessageBox,冒泡事件就没引发? --------------------编程问答-------------------- 为什么用MessageBox,冒泡事件就没引发? --------------------编程问答-------------------- 为什么用MessageBox,冒泡事件就没引发? 用其他方式,冒泡事件就引发了。 --------------------编程问答-------------------- 为什么用MessageBox,冒泡事件就没引发? 用其他方式,冒泡事件就引发了。 --------------------编程问答-------------------- 强迫在事件处理的时候引发了左键。 --------------------编程问答-------------------- 这个资源很好,我很喜欢~!!!!! --------------------编程问答--------------------
强迫在事件处理的时候引发了左键。
什么意思?详细点 --------------------编程问答-------------------- 隧道不能有"停顿",你打个断点和弹对话框都算,这个时候他就不知道往哪路由了。
比如你按钮外面有个grid,你注册了grid的previewmousedown事件,在里面打个断点,你会发现点按钮,按钮不触发click。
这是最常碰到的问题,类似的问题还有很多。 --------------------编程问答--------------------
隧道不能有"停顿",你打个断点和弹对话框都算,这个时候他就不知道往哪路由了。
比如你按钮外面有个grid,你注册了grid的previewmousedown事件,在里面打个断点,你会发现点按钮,按钮不触发click。
这是最常碰到的问题,类似的问题还有很多。
设置断点和弹对话框是不一样的吧,设置断点,代码根本就不会向后执行了,而对话框点"确定"之后,是应该继续执行的啊。
你说的隧道不能有"停顿",具体是什么规则呢,MSDN上都没说个这个事...... --------------------编程问答-------------------- 因为你用了messagebox,在wpf里面它也是个控件。而且是响应左键事件的控件。后面的引发同一楼回答,被吃掉了。 --------------------编程问答--------------------
因为你用了messagebox,在wpf里面它也是个控件。而且是响应左键事件的控件。后面的引发同一楼回答,被吃掉了。
一楼说的用右键能触发冒泡事件,但我就是用的右键啊,并没有触发。 --------------------编程问答--------------------
隧道不能有"停顿",你打个断点和弹对话框都算,这个时候他就不知道往哪路由了。
比如你按钮外面有个grid,你注册了grid的previewmousedown事件,在里面打个断点,你会发现点按钮,按钮不触发click。
这是最常碰到的问题,类似的问题还有很多。
如果仅仅是因为隧道不能有"停顿",那我取消messagebox,用Thread.Sleep(1000);停了1秒,为什么路由了呢? --------------------编程问答-------------------- 因为没有响应其他事件啊。事件不能停顿
补充:.NET技术 , C#