XAML中的事件

2016-09-23 07:39:55来源:CSDN作者:seanbei人点击

目前流行的UI框架都是事件驱动的,WPF也是如此。所有的控件,包括继承了控件类的窗口,发布了一系列事件,你可以直接订阅,这意味着当事件发生时,它会告知应用程序,执行相应动作。事件有很多种类别,通过鼠标和键盘来响应用户界面,这种是最常用的事件。大部分控件都包含KeyDown, KeyUp, MouseDown, MouseEnter, MouseLeave, MouseUp等事件。

我们仔细看看事件是如何在WPF中运作的,虽然看起来非常复杂。现在,你需要知道如何把一个控件的事件链接到后台代码文件中。来看看下面的例子吧:

<pre name="code" class="html"><span style="font-size:14px;"><Window x:Class="WpfTutorialSamples.XAML.EventsSample"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        Title="EventsSample" Height="300" Width="300">        <Grid Name="pnlMainGrid" MouseUp="pnlMainGrid_MouseUp" Background="LightBlue">                            </Grid></Window></span>

注意到我们是通过一个方法名订阅了Grid控件的MouseUp事件。这个方法需要在后台代码中定义,使用正确的事件签名。像这样:

private void pnlMainGrid_MouseUp(object sender, MouseButtonEventArgs e){        MessageBox.Show("You clicked me at " + e.GetPosition(this).ToString());}
MouseUp事件使用一个名为MouseButtonEventHandler的委托,它有两个参数,一个是sender,指示了哪一个控件触发了事件;一个是MouseButtonEventArgs对象,包含了一些有用的信息。这个例子里,MouseUp事件用于获取鼠标位置并告知用户。

某些事件使用同一个委托类型,如MouseUp和MouseDown都使用MouseButtonEventHandler这个委托,而MouseMove使用MouseEventHandler委托。在定义事件处理方法的时候,你需要知道它使用了哪个委托,如果你不知道,可以在说明文档里面查到。

幸运的是,VS能帮助我们为事件生成一个正确的事件处理方法。最简单的就是在XAML里面写好事件名,然后让VS的智能感知功能来处理。

Visual Studio helping to create a new event handler
当你选择 <New Event Handler> 时,VS会在后台代码文件里生成一个合适的事件处理程序,它被命名为“控件名_事件名”的形式,在我们的例子就是pnlMainGrid_MouseDown。右击事件名称,选择Navigate to Event Handler,VS将跳转到那里。


在后台代码订阅一个事件

上面阐述了事件订阅最常用的办法,但有时候你想直接从后台代码里订阅事件。你想在对象里直接把事件处理程序添加到事件里,这就要用到“+=” 这个C#语法了。要完整的阐述的话,这属于一个专门的C#例子,为了进行比较,来看下面的例子:

using System;using System.Windows;using System.Windows.Input;namespace WpfTutorialSamples.XAML{        public partial class EventsSample : Window        {                public EventsSample()                {                        InitializeComponent();                        pnlMainGrid.MouseUp += new MouseButtonEventHandler(pnlMainGrid_MouseUp);                }                private void pnlMainGrid_MouseUp(object sender, MouseButtonEventArgs e)                {                        MessageBox.Show("You clicked me at " + e.GetPosition(this).ToString());                }        }}
和前面一样,你还是需要知道使用了哪个委托,VS会帮助你的,一旦你这样写:pnlMainGrid.MouseDown +=

VS会给你以下提示:

Visual Studio helping to create a new Code-behind event handler
简单的按两次Tab键就可以让VS生成事件处理程序,在右下方显示当前方法,准备被植入到代码。像这样订阅事件,就不需要在XAML里面订阅了。


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台