WPF教程(七)XAML中的事件

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

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


                
                
    

 
  注意到我们是通过一个方法名订阅了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的智能感知功能来处理。


当你选择  时,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会给你以下提示:


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


你可能感兴趣的:(语言学习)