Microsoft Vietnam DPE Team| WPF Bài 6: Xử lý sự kiện và lệnh trong WPF
1
Bài 6
X LÝ S KIN VÀ LNH TRONG WPF
Các bài giảng trước ch yếu giới thiệu v các thành phần trực quan trong WPF việc làm
thế nào để tạo lập giao diện đồ ho kết hợp những thành phần đó. Tuy nhiên, một giao diện đồ họa
không ch mang tính thẩm m cao mà còn phải cho phép người dùng tương tác với các thành phần
trên đó. Việc tương tác với ứng dụng của người dùng thông qua giao diện đồ holiên quan nhiều
trên việc viết lệnh x lý sự kiện (events) lệnh (commands). Mặc các khái niệm này đã
được đề cập sơ b trong các bài giảng trước, bài giảng này giới thiệu một cách h thống hơn v
hai khái niệm quan trng này trong WPF.
1. X lý s kin trong WPF
1.1. Sự kiện
Mỗi khi bạn nhắp chuột vào một nút bấm hay gõ dòng văn bản nào đó vào một form, bạn
đang s dụng sự kiện (events). Trong lập trình, th định nghĩa sự kiện một hành động được
phát động bởi người dùng, bởi một thiết b như đồng h đếm (timer) hay bàn phím, hoặc thậm chí là
bởi h điều hành, tại những thời điểm phần lớn không theo chu trình nhất định. d, với một
thiết b định v con tr như chuột, hành động nhắp phím chuột sy nên s kiện “nhắp chuột”. Mỗi
khi một s kiện xảy ra, thông thường d liệu liên quan đến s kiện đó được thu thập chuyển
tới một đơn vị xử lý sự kiện (event handler) để xtiếp. Cũng có khi, s kiện b b qua hay chuyển
tới nhiều hàm x lý s kiện một lúc nếu những hàm x lýy cùng đồng thời lắng nghe s kiện đó.
D liệu tương ứng với một s kiện ít nhất xác định loại s kiện, nhưng đôi khi cũng bao gồm các
thông tin khác như s kiện xảy ra tại thời điểm nào, đối tượng nào phát động nó...
Thông thường, ta hầu như không suy nghĩ v việc s kiện xảy ra như thế nào, d làm sao
để máy tính nhận biết chuột trái được nhắp, hay một phím trên bàn phím được bấm do
các chi tiết mức thấp này đã được framework đồ ho trong máy tính x lý. Ngay c đối với người
phát triển, công việc của ta với s kiện phần lớn x phần b nổi của nhiều vấn đề phía sau
Microsoft Vietnam DPE Team| WPF Bài 6: Xử lý sự kiện và lệnh trong WPF
2
mỗi s kiện. Ngay c trong trường hợp đó, rất nhiều phần “b nổi” cần được xem xét. Trong
phần này, trước hết ta tìm hiểu cơ chế x lý s kiện trong WPF.
1.2. Đơn vị xử lý sự kiện
Mỗi đơn vị xử sự kiện (event handler) đơn giản một phương thức (hàm) nhận đầu vào
t một thiết b như chuột hay bàn phím thực hiện một việc nào đó để phản ứng lại với một s
kiện xảy ra trên thiết b đó. Ví d sau đây minh ho đoạn mã lệnh C# là một đơn v x lý s kiện
tên ButtonOkClicked có tác dụng x lý s kiện nút chuột được bấm:
private void ButtonOkClicked(object sender, RoutedEventArgs e)
{
this.Close(); //đóng cửa sổ hiện thời
}
Trong các phần tiếp theo, để đễ hiểu, ta dùng t hàm xử lý sự kiện” với nghĩa tương đương
đơn vị xử lý sự kiện
Thực chất, có hai bước cần thực hiện để x lý một s kiện:
1. Liên kết đơn v x lý s kiện với điu khiển (nút bấm, trường văn bản, thực
đơn…), nơi s kiện tương ứng được phát động.
2. Viết mã lệnh trong đơn v x lý s kiện để lập trình các công việc phản ứng
lại với s kiện.
hai cách để liên kết một s kiện với một đơn v x s kiện. Bạn th dùng (1) một
môi trường phát triển tích hợp (IDE) như Expression Blend hoặc WPF Designer của Visual Studio
(cách trực quan); hoặc (2) viết mã lệnh trực tiếp.
1.2.1. Cách liên kết trực quan
Để liên kết theo cách này, ta cần có các công c thiết kế giao diện GUI dành cho WPF chẳng
hạn như Expression Blend hoặc WPF Designer của Visual Studio. Với các công c này, với mỗi
phần t UI trên giao diện ta cửa s liệt kế các s kiện. Với mỗi s kiện, ta th phân định đơn
Microsoft Vietnam DPE Team| WPF Bài 6: Xử lý sự kiện và lệnh trong WPF
3
v x lý s kiện bằng cách khai báo tên hàm x lý (không gồm đối s) bên cạnh s kiện ta muốn bắt
x lý. Hình 6.1 minh ho việc khai báo hàm x lý s kiện ButtonOkClicked ứng với s kiện
Click của nút bấm btnOK s dụng Expression Blend.
Hình 6.1 - Phân định trực quan hàm ButtonOkClicked xử lý sự kiện Click
của nút btnOK trên Expression Blend
Sau khi khai báo, ta nhấn Enter, môi trường s t động tạo sinh và chuyển ta đến khuôn rỗng
của hàm x s kiện có tên giống với tên ta đã đặt cho đơn v x s kiện khi khai báo, với
danh sách tham s ngầm định tương ứng với loại s kiện. Nhiệm v của người lập trình lúc này
viết mã lệnh thực hiện các hành động phản ứng với s kiện bên trong hàm x lý này. Trong ví d v
nút bấm trên, khuôn dạng t sinh của hàm x lý s là:
private void ButtonOkClicked(object sender, RoutedEventArgs e)
{
//viết mã x lý vào đây
}
Khi nhìn lại mã XAML tương ứng, ta s thấy WPF s dụng XAML để khai báo liên kết giữa
s kiện mà hàm x lý s kiện như thế nào:
<Button HorizontalAlignment="Left" Margin="130,92,0,86" x:Name="btnOK"
Width="80" Content="OK" Click="ButtonOkClicked"/>
Microsoft Vietnam DPE Team| WPF Bài 6: Xử lý sự kiện và lệnh trong WPF
4
Như đã thấy, để gắn kết s kiện Click với hàm x ButtonOkClicked, ta th khai báo
Click="ButtonOkClicked" trong khai báo tạo lập nút bấm trong mã XAML.
1.2.2. Cách liên kết bằng mã lệnh trực tiếp
Ta cũng th liên kết s kiện vào hàm x bằng lệnh vi kết qu không đổi. Bạn
th t hỏi tại sao không chọn cách trực quan trên. Một lý do cơ bảnnếu ta muốn tạo ra các điều
khiển một cách linh động, d sinh ra một hay nhiều nút bấm trong thời gian chạy (runtime) ch
không phải tạo lập sẵn trong thời gian thiết kế form (design-time), thì cách duy nhất để liên kết s
kiện của các điều khiển đó vào hàm x lý là thông qua mã lệnh. Xétdụ sau đây:
Gi s ta một nút bấm tên btnOK, mục tiêu của ta gắn kết một s kiện của
với hàm x lý mà ch ng lệnh. Tt c nhng việc phải làm chọn tên s kiện tương ứng
ta muốn bắt liên kết với dòng lệnh new RoutedEventHandler với đối s tên của hàm x lý
của ta. Ví d:
btnOK.Click += new RoutedEventHandler(ButtonOkClicked);
Tiếp theo ta khai báo hàm x lý với đối s tương ứng với s kiện. Thông thường mỗi loại s
kiện của mỗi loại điều khiển lại đòi hỏi hàm x lý s kiện tương ứng với nó có chứa danh sách tham
s xác định (có s lượng, th t và kiểu tham s xác định trước), mặc tên gọi của hàm x lý
th tu ý. Nếu ta s dụng cách trực quan, cấu trúc của hàm x lý s kiện s được t động tạo ra.
Việc của ta ch viết nội dung x bên trong hàm x lý. Trong trường hợp viết mã lệnh, ta phải
t viết phần khai báo hàm x lý, trong đó, cần tuân theo quy tắc định nghĩa v cấu trúc tham s (s
lượng, th t, kiểu tham s) tương ứng của s kiện đó. Để biết được cấu trúc này, không khác
ngoài việc tìm đọc các tài liệu tham khảo v s kiện tương ứng, mà MSDN là tài liệu đầy đủ
chính xác nhất.
Trong ví d trên, phần ni dung hàm x lý s kiện Click trong mã C# s là:
private void ButtonOkClicked(object sender, RoutedEventArgs e)
{
this.Close();
Microsoft Vietnam DPE Team| WPF Bài 6: Xử lý sự kiện và lệnh trong WPF
5
}
Để ý rằng hàm x lý s kiện trong ví d chứa 2 tham s giá tr của chúng s được lấy t
s kiện sender tham chiếu đến đối tượng phát động s kiện ( đây là nút bấm btnOK) và event (e)
ch ra dạng tác động c th để s kiện b kích hoạt, chẳng hạn như bấm phím hay nhắp chuột...
Trong nhiều trường hợp, bạn không cần phải quan tâm đến các tham s của hàm x s kiện.
d, trong đoạn mã d trên, phần nội dung x s kiện không h dùng tới tham s sender lẫn
tham s e. Tuy nhiên, snhững trường hợp trong đó, bạn muốn s dụng cùng một hàm x lý ứng
với nhiều s kiện có cùng bản chất hoặc cho một loại sự kiện của nhiều đối tượng cùng loại. Khi đó,
ta phải quan m đến điều khiển nào đã gửi s kiện, lúc đó tham s sender event th s hữu
dụng.
1.3 Sự kiện có định tuyến
WPF m rộng hình lập trình hướng s kiện chuẩn của .NET, bằng việc đưa ra một loại
s kiện mới gọi sự kiện định tuyến (routed event). Loại s kiện này nâng cao tính linh hoạt
trong các tình huống lập trình hướng s kiện. Việc thiết lập x lý một sự kiện định tuyến
th thực hiện với cùng cú pháp với một s kiện “thường” (CLR event).
1.3.1 Cây trực quan
Trước khi bàn luận thêm v sự kiện định tuyến, một khái niệm quan trọng cần biết đó
cây trực quan (visual tree). Một giao diện người dùng WPF được y dựng theo phương thức phân
lớp, trong đó một phần t trực quan không hoặc các phần t con. Cấu trúc phân cấp của các
lớp phần t trực quan như thế trên một giao diện người dùng được gọi cây trực quan của giao
diện đó. Ví d, xét giao diện được định nghĩa bằng đoạn mã XAML sau:
<Border Height="50" Width="300" BorderBrush="Gray" BorderThickness="1">
<StackPanel Background="LightGray" Orientation="Horizontal"
Button.Click="CommonClickHandler">
<Button Name="YesButton" Width="Auto" >Yes</Button>
<Button Name="NoButton" Width="Auto" >No</Button>
<Button Name="CancelButton" Width="Auto" >Cancel</Button>
</StackPanel>