WPF冒泡事件

来源:互联网 发布:观看网络直播人群分析 编辑:程序博客网 时间:2024/05/02 02:36

今天看《WPF编程宝典》,看到了讲WPF冒泡事件一章,在这里出了问题一直没有解决,在网上搜也是这样,书上的原话是这样的:界面设计如下,有3个按钮并附加了Button.Click事件:
窗体布局
事件的函数体如下,根据Button的Name属性来获取事件的发送者:
Button.Click函数体
但是自己写了之后发现不论点击哪个按钮,sender一直是按钮容器StackPanel对象,无法转换为Button 对象,因此函数中对各个按钮设置的事件也无法调用。这里的原因我目前也还没有弄明白(先留个坑,以后再填)
难道是因为StackPanel位于顶层,Click事件都被它拦截了吗,但是StackPanel对象并没有Click事件啊!

经过自己看书之后,发现第二个参数RoutedEventArgs的source属性中对于鼠标事件时,表示的是事件发生时鼠标指针元素下面所有元素中最靠上的元素。这样不就可以获取StackPanel容器中的Button吗,于是自己编写尝试了一下:

        private void btn_Click(object sender, RoutedEventArgs e)        {            if(e.Source==cmd1)            {                MessageBox.Show("cmd1");            }            else if (e.Source == cmd2)            {                MessageBox.Show("cmd2");            }            else if (e.Source == cmd3)            {                MessageBox.Show("cmd3");            }            else            {                MessageBox.Show("null");            }        }

运行之后,点击btn1,弹出messagebox “btn1”,依次单击3个按钮,分别弹出各自的消息窗。说明在StackPanel声明的Button.Click事件能被按钮获取;而在StackPanel容器按钮之外的位置单击则不会触发事件。

总结:

在父容器中定义同一事件,例如Button.Click事件,则容器中所有Button都会在单击的时候激活该事件,但是我在编程过程中同过教程中的sender确无法判断单击来自哪个控件。然而通过RoutedEventArgs的source属性却能够获取单击来自哪个控件,然后可以通过判断,可以为不同的控件定义各自的处理事件。
如果容器中的控件对某一用户操作具有相同的响应则可以使用该方法。

初次写,不足之处还请各位见谅,有错误请不吝赐教,良辰在此谢过!

0 0
原创粉丝点击