Win10系列:UWP界面布局基础8
路由事件
XAML不仅继承了传统的事件处理方式,还引入了一个增强型事件处理机制:路由事件(RoutedEvent)。路由事件和传统事件的不同是:路由事件允许一个对象触发事件后,可以同时拥有多个事件接收者。也就是说,路由事件可以针对多个对象(而不是仅针对触发该事件的对象)调用事件处理程序。
在XAML文件中,所有的元素对象构成一种嵌套结构,当应用程序运行时,也将按照层次结构顺序由外到内对这些元素对象进行初始化,最终生成一个对象树,在Windows应用商店的空白应用程序项目中,最终生成一个以Page元素为根的对象树。基于对象树的概念,XAML中路由事件处理方式可分为以下三种:
(1)冒泡路由方式。一个对象触发事件后,事件将沿着对象树由下至上,由子元素对象到父元素对象传播扩散,直到到达对象树的根元素,或者该事件的Handled属性取值为true时,完成处理。在传播扩散中,所有涉及的元素对象都会调用相应的事件处理程序。
(2)隧道路由方式。该类事件处理方式和冒泡方式相反,在对象触发事件后,事件将从根对象传播扩散到触发该事件的对象,或者该事件的Handled属性取值为 true时,完成处理。
(3)直接路由方式。在这种处理方式中事件不进行向上或向下传播扩散,仅作用于触发该事件的当前对象上。
下面以冒泡路由方式为例来演示路由事件的处理过程。新建一个Windows应用商店的空白应用程序项目,将其命名为BubblingRoutedEventApplication,打开项目下的MainPage.xaml文件,在Grid元素中添加如下代码:
<Grid PointerPressed="Grid_PointerPressed" Height="250" Width="300" Background="Black">
<TextBlock Text="Grid控件" FontWeight="Bold" Margin="5"/>
<Canvas Background="Gray" PointerPressed="Canvas_PointerPressed" Margin="29,30,25,35">
<TextBlock Text="Canvas控件" FontWeight="Bold" Foreground="White" Margin="5"/>
<StackPanel Height="117" Width="196" Background="Black" Canvas.Top="30" Canvas.Left="26" PointerPressed="StackPanel_PointerPressed">
<TextBlock Text="StackPanel控件" FontWeight="Bold" Margin="5"/>
<TextBlock Text="事件冒泡顺序是:" FontWeight="Bold" Margin="5"/>
<TextBox Name="ShowEventOrder" BorderBrush="Gray" Background="Black" FontSize="10" Foreground="White" TextWrapping="Wrap" Margin="10,0" Height="65"/>
</StackPanel>
</Canvas>
</Grid>
在上面的代码中,添加了一个Grid控件,设置背景色为黑色,并为PointerPressed事件注册了处理方法Grid_PointerPressed,同时在该控件内部添加了一个TextBlock控件和一个Canvas控件, 其中TextBlock控件的文本内容为"Grid控件",Canvas控件的背景色为灰色,并为Canvas控件的PointerPressed事件注册了处理方法Canvas_PointerPressed。接着在Canvas控件内又添加了一个TextBlock控件和一个StackPanel控件,TextBlock控件的文本内容为"Canvas控件",文本颜色为白色,StackPanel控件的背景色为黑色,并为PointerPressed事件注册了处理方法StackPanel_PointerPressed。最后在StackPanel控件中,先添加了两个TextBlock文本块,其中一个文本块的文本内容为"StackPanel控件",另一个文本块的文本内容为"事件冒泡顺序是:",随后又定义了一个文本框,将其命名为ShowEventOrder,并分别设置文本框的边框颜色和字体颜色等。
布局好前台界面后,打开MainPage.xaml.cs文件,分别为Grid控件、Canvas控件和StackPanel控件的PointerPressed事件定义相应的事件处理方法。
Grid控件的PointerPressed事件处理方法Grid_PointerPressed的代码片段如下所示:
private void Grid_PointerPressed(object sender, PointerRoutedEventArgs e)
{
ShowEventOrder.Text += "Grid; ";
e.Handled = true;
}
在上面的代码中,将"Grid; "字符串追加到ShowEventOrder文本框中,并通过设置参数e的Handled属性值为true来停止事件传播。
Canvas控件的PointerPressed事件处理方法Canvas_PointerPressed的代码片段如下所示:
private void Canvas_PointerPressed(object sender, PointerRoutedEventArgs e)
{
// 将"Canvas - "字符串追加到ShowEventOrder文本框中
ShowEventOrder.Text += "Canvas - ";
}
StackPanel控件的PointerPressed事件处理方法StackPanel_PointerPressed的代码片段如下所示:
private void StackPanel_PointerPressed(object sender, PointerRoutedEventArgs e)
{
// 将"StackPanel - "字符串追加到ShowEventOrder文本框中
ShowEventOrder.Text += "StackPanel - ";
}
启动调试,未单击任何控件区域之前的效果如图3-13所示。
图3-13 界面初始状态
当单击Grid控件区域时,Grid对象会触发PointerPressed事件,并且调用相应的事件处理方法Grid_PointerPressed,完成将字符串"Grid;
"追加到ShowEventOrder文本框中。这时,事件的Handled属性值已经为true,所以事件停止扩散,最终产生的结果如图3-14所示。
图3-14 单击Grid控件区域产生的结果
当单击Canvas控件区域时,Canvas对象会触发PointerPressed事件,并且调用相应的事件处理方法Canvas_PointerPressed,完成将字符串"Canvas- "追加到ShowEventOrder文本框中。由于Canvas对象还有一个父对象Grid,因此事件会继续向上传播,调用Grid的事件处理方法Grid_PointerPressed。事件传到Grid对象后就停止传播,最终产生的结果如图3-15所示。
图3-15 单击Canvas控件区域产生的结果
当单击StackPanel控件区域时,StackPanel对象会触发PointerPressed事件,并且调用相应的处理方法StackPanel_PointerPressed,完成将字符串"StackPanel - "追加到ShowEventOrder文本框中。由于StackPanel对象上面还有父对象,因此事件会继续向上传播,依次调用Canvas对象的事件处理方法Canvas_PointerPressed和Grid对象的事件处理方法Grid_PointerPressed。待事件传到Grid对象后,将停止传播,最终产生的结果如图3-16所示。
图3-16 单击StackPanel控件区域产生的结果
Win10系列:UWP界面布局基础8的更多相关文章
- Win10系列:UWP界面布局基础1
随着技术的不断发展,使用者对应用程序的界面体验提出了更高的要求,为了应对越来越复杂的界面设计需求和有效的简化界面开发过程,微软公司在其应用程序的开发技术当中引入一套新的应用程序界面描述语言,这就是XA ...
- Win10系列:UWP界面布局基础7
2.附加属性 有一些XAML元素,其自身的属性大多是在其它的元素中声明和使用的,该元素本身却很少使用,这些在其他元素中声明和使用的属性被称为附加属性(Attached Properties).附加属性 ...
- Win10系列:UWP界面布局基础4
类型转换 前面讲到过,在定义元素时可以通过Attributes特性方式为其设置属性并为属性赋值,在实际开发中所赋予的值可能和属性本身的数据类型不相符,这时XAML解析器就会使用类型转换器(Type C ...
- Win10系列:UWP界面布局基础2
属性设置 在面向对象程序开发中,所提及的属性通常指的是对象的属性.在XAML代码中,定义元素时也可以为其设置属性,例如对于一个TextBox元素,有背景属性.宽度属性和高度属性等.为了满足实际应用的需 ...
- Win10系列:UWP界面布局基础12
画刷 画刷(Brush)用于为图形元素填充颜色.在XAML中,画刷有许多属性,其中较常使用的是Fill属性和Stroke属性,Fill用于填充图形的背景色,而Stroke用于设置图形的线条颜色. 在实 ...
- Win10系列:UWP界面布局基础11
样式继承 为了使样式便于维护及重复使用,可以在一个样式上引用其他的样式,这就是样式继承.样式继承的方法是:在Style元素的BasedOn属性上使用StaticResource标记扩展来引用被继承的样 ...
- Win10系列:UWP界面布局基础5
(2)编写后台代码访问资源 下面通过一个例子来演示如何编写后台代码引用资源.新建一个Windows应用商店的空白应用程序项目,将其命名为AccessResourceApplication,打开项目下的 ...
- Win10系列:UWP界面布局基础3
在实际项目开发中,为控件属性赋值时经常会遇到属性值在设计时处于未知状态,而只有在应用程序运行时才能获取到.这种情况下,直接赋值方法是无法满足的,可以使用XAML标记扩展(Markup Extensio ...
- Win10系列:UWP界面布局基础9
在XAML中,样式.模板.画笔和动画等都被看做是资源,它们最终的作用都是相同的,就是让设计人员可以使用这些资源创建更好的视觉效果,对其设计的产品外观进行标准化统一,那么如何使用这些资源并组织和重用呢, ...
随机推荐
- R语言网页爬虫
R 是统计计算和数据分析的利器.给定一个数据集,利用前几章介绍到的 R 中灵活的数据结构或高性能计算,我们可以很方便地进行数据转换.建模和数值分析.一般来说,商业数据库会将数据以表格的形式很好地组织起 ...
- django人类可读性
一些Django的‘奇技淫巧’就存在于这些不起眼的地方. 为了提高模板系统对人类的友好性,Django在django.contrib.humanize中提供了一系列的模板过滤器,有助于为数据展示添加“ ...
- Hadoop大数据分析应用场景
J 为了满足日益增长的业务变化,京东的京麦团队在京东大数据平台的基础上,采用了hadoop等热门的开源大数据计算引擎,打造了一款为京东运营和产品提供决策性的数据类产品-北斗平台. 一.Hadoop的应 ...
- 力扣(LeetCode)728. 自除数
自除数 是指可以被它包含的每一位数除尽的数. 例如,128 是一个自除数,因为 128 % 1 == 0,128 % 2 == 0,128 % 8 == 0. 还有,自除数不允许包含 0 . 给定上边 ...
- Codeforces 1053 B - Vasya and Good Sequences
B - Vasya and Good Sequences 思路: 满足异或值为0的区间,必须满足一下条件: 1.区间中二进制1的个数和为偶数个; 2.区间二进制1的个数最大值的两倍不超过区间和. 如果 ...
- Codeforces 1005 E2 - Median on Segments (General Case Edition)
E2 - Median on Segments (General Case Edition) 思路: 首先我们计算出solve(m):中位数大于等于m的方案数,那么最后答案就是solve(m) - s ...
- js实现文件的上传和输出,拖拽上传图片
js文件上传 文件下载 以前的文件的下载都是在服务器,现在也是放在服务器比较好,有时候为了一些开发的方便,我们临时把处理的数据就放在了本地,然后自己访问.这个也是可以的. 1.利用html5的 Fil ...
- 为 昂达 v891 安装上了 remix OS 了
起因: 默认的ROM自带一堆垃圾app,最主要的是没有root , 所以卸载不了. 然后试了 Root大师 , 刷机精灵 之类的软件. 我 CTMD , 简直比出厂ROM 还流氓, 不断的强制安装各种 ...
- ubuntu18.04安装jdk1.8.0_11并配置环境变量.md
参考:https://www.jianshu.com/p/95f075761dc0 由于安装文件免安装程序,故只需要将对应文件复制到相应目录,然后配置环境变量即可: 1.移动文件到指定目录 (1)在/ ...
- Dynamic Shortest Path CodeForces - 843D (动态最短路)
大意: n结点有向有权图, m个操作, 增加若干边的权重或询问源点为1的单源最短路. 本题一个特殊点在于每次只增加边权, 并且边权增加值很小, 询问量也很小. 我们可以用johnson的思想, 转化为 ...