路由事件

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的更多相关文章

  1. Win10系列:UWP界面布局基础1

    随着技术的不断发展,使用者对应用程序的界面体验提出了更高的要求,为了应对越来越复杂的界面设计需求和有效的简化界面开发过程,微软公司在其应用程序的开发技术当中引入一套新的应用程序界面描述语言,这就是XA ...

  2. Win10系列:UWP界面布局基础7

    2.附加属性 有一些XAML元素,其自身的属性大多是在其它的元素中声明和使用的,该元素本身却很少使用,这些在其他元素中声明和使用的属性被称为附加属性(Attached Properties).附加属性 ...

  3. Win10系列:UWP界面布局基础4

    类型转换 前面讲到过,在定义元素时可以通过Attributes特性方式为其设置属性并为属性赋值,在实际开发中所赋予的值可能和属性本身的数据类型不相符,这时XAML解析器就会使用类型转换器(Type C ...

  4. Win10系列:UWP界面布局基础2

    属性设置 在面向对象程序开发中,所提及的属性通常指的是对象的属性.在XAML代码中,定义元素时也可以为其设置属性,例如对于一个TextBox元素,有背景属性.宽度属性和高度属性等.为了满足实际应用的需 ...

  5. Win10系列:UWP界面布局基础12

    画刷 画刷(Brush)用于为图形元素填充颜色.在XAML中,画刷有许多属性,其中较常使用的是Fill属性和Stroke属性,Fill用于填充图形的背景色,而Stroke用于设置图形的线条颜色. 在实 ...

  6. Win10系列:UWP界面布局基础11

    样式继承 为了使样式便于维护及重复使用,可以在一个样式上引用其他的样式,这就是样式继承.样式继承的方法是:在Style元素的BasedOn属性上使用StaticResource标记扩展来引用被继承的样 ...

  7. Win10系列:UWP界面布局基础5

    (2)编写后台代码访问资源 下面通过一个例子来演示如何编写后台代码引用资源.新建一个Windows应用商店的空白应用程序项目,将其命名为AccessResourceApplication,打开项目下的 ...

  8. Win10系列:UWP界面布局基础3

    在实际项目开发中,为控件属性赋值时经常会遇到属性值在设计时处于未知状态,而只有在应用程序运行时才能获取到.这种情况下,直接赋值方法是无法满足的,可以使用XAML标记扩展(Markup Extensio ...

  9. Win10系列:UWP界面布局基础9

    在XAML中,样式.模板.画笔和动画等都被看做是资源,它们最终的作用都是相同的,就是让设计人员可以使用这些资源创建更好的视觉效果,对其设计的产品外观进行标准化统一,那么如何使用这些资源并组织和重用呢, ...

随机推荐

  1. Qt5_当前exe所在路径

    可以通过以下方式来获取: 1. #include <QDir>#include <QDebug> QDir dir; qDebug() << "curre ...

  2. 重装win7系统并激活

    备份 大白菜制作启动盘 下载大白菜软件UEFI版(新电脑使用uefi版本,装机版支持的主板多) 选择默认安装 选择默认模式开始制作 下载iso镜像文件,复制到u盘(手动复制) 设置bios       ...

  3. 学习笔记18—circos应用集

    一.在线画图(行列分别最大为75) 相信大家都听说过circos图,但是亲自画过的人可能就很少,这主要因为软件的安装和使用稍微有一点麻烦.其实,circos图也是可以在线绘制的,这样就简单多了!一起来 ...

  4. Jmeter 如何引入外部jar 包

    最近使用Jmeter 测试需要引入Jar包,之前也遇到过,用过两种方式,各有利弊,今天又接触了一种方式,挺好,在此做一总结. 方法一:测试计划 通过 Add directory or jar to c ...

  5. 第 3 章 镜像 - 015 - 调试 Dockerfile

    如何 debug Dockerfile 通过 Dockerfile 构建镜像的过程 从 base 镜像运行一个容器 执行命令对容器做修改 执行类似 docker commit 的操作,生成一个新的镜像 ...

  6. 绕过cookies进行登录并封装请求方法

    之前写了一篇使用session跨请求保持会话的帖子,这次在它的基础上对请求方法简单封装一下,可以达到复用的效果 1.先定义登录方法 在登录方法中利用session跨请求保持会话,并返回session, ...

  7. C# 连接PDA扫码枪

    Symbol扫码枪开发文档 一.主要功能 实现symbol扫码枪和PC数据交互. 二.运行环境 SymbolMC32NO 三.开发工具与软件 开发环境:Win7 开发语言:C# 数据库:Sql Ser ...

  8. R语言中知识点总结(二)

    一些函数不知道什么意思要查,看数值例子,做笔记,知道函数的功能,函数和返回值. 网页上查找关键词,巧用查找(ctrl+F) 数据读取处理,有read.table   read R-读取数据(导入csv ...

  9. 发布web站点数据库环境的问题

    今天在公司部署web站点的时候发现了一个比较低级的错误,公司映射的外网的IP我们内部人员是无法进行访问的,结果我把站点配置文件中的IP改成是外网的IP,站点一直无法访问到数据.后面发现问题是,当外网用 ...

  10. php算法,冒泡排序

    冒泡排序 /*** *从小到大排列 * 逻辑分析 假设数组 $arr=[a,b,c,d]; * 总数=4; * 比较对象 第几个元素 比较次数 * a 1 3 * b 2 2 * c 3 1 **/ ...