1. 程式人生 > >WPF教程(七)XAML中的事件

WPF教程(七)XAML中的事件

目前流行的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裡面訂閱了。