博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF 冒泡路由事件
阅读量:5749 次
发布时间:2019-06-18

本文共 2107 字,大约阅读时间需要 7 分钟。

    在WPF中,例如,可以构建一个包含图形的按钮,创建一个具有文本和图片混合内容的标签,或者为了实现滚动或折叠的显示效果在一个特定的容器中放置内容。甚至可以多此重复嵌套,直到达到您所希望的层次深度。

    这种可以任意嵌套的能力也带来了一个有趣的问题。例如,假设有一个标签,它包含一个StackPanel面板,该面板又包含了两块文本图像:

    正如您已经知道的,放在WPF窗口中的所有要素都在一定层次上继承自UIElement类,包括Label、StackPanel、TextBlock 和 Image 。 UIElement 定义了一些核心事件。例如,每个继承自 UIElement 的类都具有一个 MouseDown 事件和 MouseUp 事件。

    但是当单击上面这个特殊标签中的图像部分时,想一想会发生什么事情?很明显,印发Image.MouseDown 事件和 Image.MouseUp 事件是合情合理的。但是我们一般实际期望的结果并不是这样,而是无论用户单击了图像、某块文本还是标签内的空白处。不管在什么位置点击都触发同一个事件来进行处理。

 

    因为MouseUp事件和MouseDown事件都是冒泡路由事件,所以他们会依次向上传递事件触发,如:点击TextBlock 会依次触发:TextBlock、StackPanel、Lable、.....直到window窗体为最后一站传递点。也许这也并不是我们希望的结果,幸运的是在 WPF 中所有事件的参数类都继承自 RoutedEventArgs ,任何事件处理程序都可以使用这些属性。其中有一个 Handled 属性,则是可以终止继续往上层次冒泡的属性。该属性为True时,则终止冒泡。

 

    下面以一个例子来实验这种冒泡路由事件效果:

效果:

 

XAML代码:

Handle first event

注意:代码中包含了在C:\1jpg 文件,请自行随意找一个文件代替吧。

 

C#代码:

int _eventCounter = 0;        private void SomethingClicked(object sender, MouseButtonEventArgs e)        {            _eventCounter++;            string message = "#" + _eventCounter.ToString() + ":\r\n" +                " Sender: " + sender.ToString() + "\r\n" +                " Source: " + e.Source + "\r\n" +                " Original Source: " + e.OriginalSource;            lstMessage.Items.Add(message);            e.Handled = (bool)chkHandle.IsChecked;        }        private void cmdClear_Click_1(object sender, RoutedEventArgs e)        {            _eventCounter = 0;            lstMessage.Items.Clear();        }

 

源码下载:

使用工具:VS2012

参考:

转载于:https://www.cnblogs.com/andrew-blog/p/WPF_BubbledEvent.html

你可能感兴趣的文章
Git原理与高级使用(3)
查看>>
你了解SEO中的时效性吗?
查看>>
从JDK源码看Writer
查看>>
[iOS]0 行代码集成 UILabel 字符串匹配
查看>>
Express 结合 Webpack 实现HMRwi
查看>>
mysql的handler_read_next理解
查看>>
《SAFe 4.0参考指南:精益软件与系统工程的规模化敏捷框架》一1.5 SAFe的原则...
查看>>
终年32岁的传奇数学家,为何让硅谷领袖们集体落泪致敬?
查看>>
listen源码分析第一篇 address:port分析
查看>>
代码不规范,同事两行泪
查看>>
iOS开发UI篇--一个支持图文混排的ActionSheet
查看>>
持续集成:数据库集成及快速构建
查看>>
Java8 方法引用
查看>>
基于jq的bootstrap 常用样式demo 引入css jq js文件后样式出现
查看>>
信息化建设的一些想法和思考
查看>>
ES6之Array.from()方法
查看>>
ios12设计规范(上)
查看>>
Android 网络优化,使用 HTTPDNS 优化 DNS,从原理到 OkHttp 集成
查看>>
GCD Tips
查看>>
【本人秃顶程序员】求求你别用SimpleDateFormat了!
查看>>