This article has been localized into Vietnamese by the community.
Events (sự kiện) trong XAML
Hầu hết các UI framework hiện đại đều được định hướng sự kiện và WPF cũng vậy. Tất cả các controls, bao gồm cả Window (cũng kế thừa lớp Control) sẽ hiển thị một loạt các sự kiện mà bạn có thể đăng ký. Bạn có thể đăng ký các sự kiện này, điều đó có nghĩa là ứng dụng của bạn sẽ thông báo khi chúng xảy ra và bạn cũng có thể tương tác với điều đó.
Có rất nhiều loại sự kiện, nhưng một số loại thường được sử dụng nhất là dùng để phản hồi tương tác của người dùng với ứng dụng của bạn bằng chuột hoặc bằng bàn phím. Trên hầu hết các control, bạn sẽ tìm thấy các sự kiện như KeyDown, KeyUp, MouseDown, MouseEnter, MouseLeave, MouseUp và nhiều sự kiện khác.
Chúng ta sẽ xem xét ký hơn cách các sự kiện hoạt động trong WPF, đó là một chủ đề phức tạp, nhưng bây giờ, bạn cần biết cách liên kết một sự kiện của control trong XAML đến một phần code trong file Code-behind của bạn. Hãy xem ví dụ này:
<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>
Chú ý cách chúng ta đăng ký cho sự kiện MouseUp của Grid bằng cách viết tên phương thức. Phương thức này cần được định nghĩa trong code-behind, sử dụng tên đăng ký sự kiện chính xác. Trong trường hợp này, nó sẽ hiển thị như thế này:
private void pnlMainGrid_MouseUp(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("You clicked me at " + e.GetPosition(this).ToString());
}
Sự kiện MouseUp sử dụng một delegate tên là MouseButtonEventHandler, sự kiện mà bạn đã đăng ký. Nó có hai tham số (parameter), một sender (control đưa ra sự kiện) và một đối tượng (object) MouseButtonEventArgs có chứa thông tin cần thiết. Chúng ta sử dụng nó trong ví dụ để xác định vị trí chuột trỏ tới và cho người dùng biết về nó.
Một số sự kiện có thể sử dụng cùng một loại delegate - ví dụ, MouseUp và MouseDown đều sử dụng delegate MouseButtonEventHandler, trong khi sự kiện MouseMove sử dụng delegate MouseEventHandler. Khi định nghĩa phương thức xử lý xự kiện, bạn cần biết delegate nào mà nó sử dụng và nếu bạn không biết điều đó, bạn có thể tra cứu nó trong tài liệu.
May mắn thay, Visual Studio có thể giúp chúng ta tạo ra (generate) một trình xử lý sự kiện chính xác cho một sự kiện. Cách dễ nhất để làm điều này là viết tên sự kiện trong XAML và sau đó hãy để IntelliSense của VS (Visual Studio) thực hiện phần còn lại cho bạn:
Khi bạn chọn <New Event Handler> Visual Studio sẽ tạo ra (generate) một trình xử lý sự kiện thích hợp trong file code-behind của bạn. Nó sẽ được đặt tên theo định dạng <control name>_<event name>, trong trường hợp của chúng ta là pnlMainGrid_MouseDown. Nhấp chuột phải vào tên sự kiện và chọn Navigate to Event Handler, VS sẽ đưa bạn đến đó.
Đăng ký một sự kiện từ Code-behind
Cách phổ biến nhất để đăng ký các sự kiện như đã đề cập ở trên, nhưng có thể đôi khi bạn muốn đăng ký sự kiện trực tiếp từ Code-behind. Việc này được thực hiện bằng cách sử dụng cú pháp += của C#, nơi bạn thêm một trình xử lý sự kiện (event handler) cho sự kiện trực tiếp trên đối tượng. Lời giải thích đầy đủ về điều này thuộc về một ví dụ thường dùng, nhưng để so sánh, đây là một ví dụ:
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());
}
}
}
Một lần nữa, bạn cần biết delegate nào được sử dụng, và một lần nữa, Visual Studio có thể giúp bạn với điều này. Ngay sau khi bạn viết:
pnlMainGrid.MouseDown +=
Visual Studio sẽ cung cấp sự hỗ trợ này:
Chỉ cần nhấn phím [Tab] hai lần để Visual Studio tạo ra (genegate) trình xử lý sự kiện (event handler) chính xác cho bạn, ngay bên dưới phương thức hiện tại, sẵn sàng để thực hiện. Khi bạn đăng ký các sự kiện như thế này, bạn không cần đăng ký sự kiện trong XAML.