Events,中文称为事件,是Windows消息机制中重要概念之一,也是最常见的人机交互手段之一。
XAML和其他开发语言类似,具有事件机能,帮助应用管理用户输入,执行不同的行为。根据用户不同的操作,执行不同的业务逻辑代码。
例如,用户输入日期,点击按钮确认,移动鼠标等操作都可以使用事件进行管理。
而在Windows 8和Silverlight应用开发中,事件常常被用于控制更改通知操作,例如,使用ListBox绑定一个依赖属性,当该属性值修改时,可以通过事件自动通知客户端,并更新显示属性值。
本篇,将详细介绍XAML的事件处理。
快速理解Xaml事件
在传统应用中,一个对象激活一个事件被称为EventSender(事件发送者),而事件所影响的对象则称为EventReceiver(事件接收者)。 例如,在Windows Forms应用开发中,对象事件的sender和receiver永远是同一个对象。简单的理解,如果你点击一个按钮对象,这个按钮对象激活Click事件,同时该对象后台代码将接收事件,并执行相关逻辑代码。
而XAML中不仅继承传统事件处理方式,并且引入依赖属性系统,同时还引入一个增强型事件处理系统 - RoutedEvent(路由事件)。路由事件和传统事件的不同是,路由事件允许一个对象激活事件后,既是一个EventSender(事件发送者),同时拥有一个或者多个EventReceiver(事件接收者)。
Xaml事件基础语法
事件在Xaml中基础语法如下:
<元素对象 事件名称=”事件处理”/>
例如:使用按钮控件的Click事件,响应按钮点击效果,代码如下:
<Button Click=”Button_Click”/>
其中Button_Click连接后台代码中的同名事件处理程序:
Private void Button_Click(object sender,RoutedEventArgse)
{
事件处理
}
在实际项目开发中,Visual Studio 的Xaml语法解析器为开发人员提供了智能感知功能,通过该功能可以在Xaml中方便的调用指定事件,而Visual Studio将为对应事件自动生成事件处理函数后台代码。
XAML路由事件(RoutedEvent)处理方式
前几篇实例教程曾介绍过,XAML对象元素是基于层次型结构的可扩展应用程序标记语言,当XAML应用运行时,页面内的控件对象将按照层次结构顺序进行初始化,最终生成一个对象树结构。在Windows
8应用中,最终生成一个根为Window对象的对象树,而在Silverlight,将生成一个根为UserControl对象的对象树。
XAML的路由事件(Routed Events)处理方式可分为三种:
1. 冒泡事件(BubblingEvent),该事件是最常见的事件处理方式。该事件表示对象激活事件后,将沿着对象树由下至上,由子到父的方式传播扩散,直到被处理或者到达对应的根对象元素,或者该事件对应得RoutedEventArgs.Handled = true时,完成处理。在传播扩散中,所有涉及的元素对象都可以被该事件进行控制。该事件可被Windows 8,Silverlight支持。
2. 隧道事件(TunnelingEvent),该事件处理方式和冒泡事件相反,对象激活事件后,将从根对象元素传播扩散到激活事件的子对象,或者该事件对应得RoutedEventArgs.Handled = true时,完成处理。该事件仅Windows 8支持。
3. 直接路由事件(Direct Routing Event), 该事件没有向上或者向下传播扩散,仅作用于当前激活事件的对象上。该事件可被Windows 8, Silverlight支持。
在Windows 8Metro应用中,测试冒泡事件实例。
创建三个不同的布局控件Grid,Canvas,StackPanel,通过PointerPressed事件查看事件激活顺序。
1<Gridx:Name="LayoutRoot"Background="{StaticResourceApplicationPageBackgroundThemeBrush}"PointerPressed="LayoutRoot_PointerPressed_1">
2<TextBlockText="Grid控件测试"FontWeight="Bold"Margin="5"/>
3<CanvasHeight="200"Width="300"Background="Blue"PointerPressed="Canvas_PointerPressed_1">
4<TextBlockText="Canvas控件测试"FontWeight="Bold"Foreground="Yellow"Margin="5"/>
5<StackPanelHeight="150"Width="250"Background="Green"Canvas.Top="25"Canvas.Left="25"PointerPressed="StackPanel_PointerPressed_1">
6<TextBlockText="StackPanel控件测试"FontWeight="Bold"Margin="5"/>
7<TextBlockText="鼠标左键点击,冒泡事件顺序:"FontWeight="Bold"Margin="5"/>
8<TextBlockx:Name="eventOrder"Width="250"TextWrapping="Wrap"/>
9</StackPanel>
10</Canvas>
11</Grid>
应用以上XAML代码后,则会生成以下对象树:
后台代码如下:
privatevoidCanvas_PointerPressed_1(objectsender,PointerRoutedEventArgse)
{
eventOrder.Text+="Canvas-";
}
privatevoidLayoutRoot_PointerPressed_1(objectsender,PointerRoutedEventArgse)
{
eventOrder.Text+="Grid;";
e.Handled=true;
}
privatevoidStackPanel_PointerPressed_1(objectsender,PointerRoutedEventArgse)
{
eventOrder.Text+="StackPanel-";
}
Windows 8测试效果:
添加和删除事件处理器
从上例可以看到,XAML添加事件非常简单。下面通过实例介绍如何在后台代码添加XAML对象事件。
<StackPanelHeight="150"Width="250"Background="Red"Grid.Row="1"Orientation="Vertical"PointerPressed="StackPanel_PointerPressed_2">
<Buttonx:Name="btOK"Content="提交"Margin="5"Width="100"/>
<TextBlockx:Name="eventContent"Width="250"TextWrapping="Wrap"Foreground="Yellow"/>
</StackPanel>
上面代码,添加一个按钮控件和文本显示框,其中按钮控件没有声明Click事件,使用C#后台代码声明事件委托操作符是“+=”。其格式如下:
btOK.Click+=newRoutedEventHandler(btOK_Click_1);
通常来说,建议将事件委托声明放在根对象的Loaded事件中,也可以将事件委托代码放在构造函数中。
删除一个事件委托,则使用“-=”操作符,其格式如下:
btOK.Click-=newRoutedEventHandler(btOK_Click_1);
运行后,点击按钮,则会激活事件:
XAML在Windows 8 Metro中的新特性
微软Windows 8系统不仅适用于PC,而且适用于平板电脑。针对平板电脑的特性,XAML也增加了新的事件处理特性。主要体现在:
1. 继承传统事件处理机制,XAML将控制按钮点击事件;
2. 监听列表控件选项事件;
3. 监听应用激活和暂停事件;
4. 触控事件处理,包括指针处理,手势处理以及控制操作事件等;
常用触控事件列表:
Pointers:
Pressed
Released
Moved
Canceled
CaptureLost
Entered
Exited
Gestures:
Tapped
RightTapped
Holding
DoubleTapped
Manipulation:
Starting
Started
Delta
Completed
InteriaStarting
实例代码如下:
这篇介绍到这里,欢迎留言讨论。
XAML实例教程系列:
欢迎大家留言交流,或者加入交流学习:
22308706(一群) 超级群500人
37891947(二群) 超级群500人
100844510(三群) 高级群200人
32679922(四群) 超级群500人
23413513(五群) 高级群200人
32679955(六群) 超级群500人
88585140(八群) 超级群500人
128043302(九群 企业应用开发推荐群) 高级群200人
101364438(十群) 超级群500人
68435160(十一群 企业应用开发推荐群)超级群500人
分享到:
相关推荐
XAML-基础教程 pdf格式, 好东西,就不介绍了
Xaml-Spinners-WPF, 可用的WPF加载微调器 http Xaml-Spinners-WPF 免费的WPF加载微调器,这里提供完整信息: http://blackspike.com/silverlight-spinner/下面是一些我们用Blend和Illustrator制作的免费 sp
Xamarin XAML语言教程基础语法篇
python库,解压后可用。 资源全名:xaml-0.5.4-py2.py3-none-any.whl
Xamarin XAML语言教程
Xamarin XAML语言教程页面布局篇
WPF开发教程.rar 目录 WPF基础入门 3 1. WPF基础之体系结构 3 2. WPF基础之XAML 9 3. WPF基础之基元素 23 4. WPF基础之属性系统 26 5. WPF基础之路由事件 33 6. WPF基础之布局系统 46 7. WPF基础之样式设置和模板化...
XML&XAML基础教程,帮你理解 XML XAML 概念 概述 语法
一个能够将SVG文件转换为XAML格式以便WPF程序显示的控制台程序。命令使用格式为:Svg2XamlDemo.exe c:\data\input.svg,则会生成对应的XAML文件 c:\data\input.xaml
Microsoft.UI.Xaml.2.7_7.2208.15002.0_x64__8wekyb3d8bbwe
wfp从零开始,xaml从零开始学习,以及mvvm设计模式
XAML 入门经典教程,虽然为英文教程,但是容易理解,期待牛人翻译出来贡献大家,方便大家阅读,期待大家共同进步。
资源来自pypi官网。 资源全名:xaml-0.5.4-py2.py3-none-any.whl
XAML in a Nutshell covers everything necessary to design user interfaces and .NET applications that take advantage of WPF. Prerequisites such as Microsoft's new unified build system, MSBuild, and core...
XAML 地图控件一组用于 WPF、UWP 和 WinUI 的控件,用于渲染来自不同提供商的数字地图和各种类型的地图叠加层。 通过为其地图图块 URL 指定模板字符串,可以轻松添加地图提供者。 地图叠加层允许在地图上绘制图形...
类型/属性/事件的集合是XAML的,但是JS库可以包装那些类型/属性/事件,以与平台无关的方式公开Windows控件(例如,作为对Windows实施跨平台控件的一种方法)。 react-native-xaml通过利用元数据获取XAML属性,类型...
23.Xaml Frame控件->导航控件
XAML语法,具有Silverlight, WPF, Windows Phone以及Windows 8开发经验的程序员,可以将开发技能再利用,加快学习速度,提高开发效率 语言性能强大,学习曲线平缓, 有强大的开发工具支持 XAML是Windows 8 Style风格...
以实例方式说明WPF MaterialDesignInXaml 的使用,内容详细,思路清晰,实战性强。
0 大家都知道 XAML是“用来设计UI”的 设计师用XAML设计出来的UI其后台代码(程序逻辑)可以由程序员用C#或者VB去写 这叫做Code behind 实际上 设计师用XAML和程序用C#都是在构建同一个类 换句话说就是:把一个类劈...