This article is currently in the process of being translated into Hebrew (~99% done).
אירועים ב-XAML
רוב סביבות העבודה המודרניות לפיתוח ממשקי משתמש (UI), ובהן גם סביבת הWPF, הנן סביבות מונעות אירועים (Event Driven). כל סוגי התצוגות (Controls), בהם חלונות (אשר גם יורשים מהControl class) , חושפים מגוון אירועים אליהם ניתן להירשם. רישום לאירוע, משמעותו היא שהאפליקציה שרצה מאחורי ממשק המשתמש תהיה מיודעת אודות האירוע הספציפי בעת התרחשותו בזמן ריצת התכנית ותוכל להגיב לו בהתאם.
ישנם סוגי אירועים רבים, אך האירועים הנפוצים בשימוש הם אירועים שמטרתם לאפשר לאפליקציה להגיב לפעולת משתמש (כגון שימוש במקלדת או עכבר). ברוב סוגי התצוגות (Controlers) ניתן יהיה להירשם לאירועים כגון KeyDown, KeyUp, MouseDown, MouseEnter, MouseLeave, MouseUp וכמה אירועים נוספים.
אופן פעולת האירועים בWPF הוא נושא מורכב ולכן יבחן לעומק בהמשך המדריך. בשלב זה, עליך לדעת כיצד לקשר בין אירוע פעולת משתמש (Control Event) בקובץ הXAML לקטע קוד בקובץ המפעיל את האפליקציה ברקע. התבוננו בדוגמא:
<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>
בדוגמא זו נרשמנו לאירוע "MouseUp" של התצוגה (ה- Control) הנקראת "Grid" ע"י הוספת שם לפעולה (הפונקציה/ המתודה) שתתבצע בעת התרחשות האירוע. פעולה זו (הפונקציה) צריכה להיות ממומשת בקוד של האפליקציה המקושרת לממשק המשתמש, תוך התחשבות בטיפוס החתימה הנדרש לטיפול באירוע הספציפי אליו נרשמנו. בדוגמא זו, חתימת הפונקציה צריכה להראות כך:
private void pnlMainGrid_MouseUp(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("You clicked me at " + e.GetPosition(this).ToString());
}
הDelegate של האירוע "MouseUp" נקרא MouseButtonEventHandler ואליו יש לבצע את הרישום. Delegate זה מקבל שני פרמטרים : 1. "Sender" - התצוגה (Control) בו התרחש האירוע. 2. "MouseButtonEventArgs" - אובייקט שמכיל מידע חיוני אודות האירוע. בדוגמא הבאה נשתמש באובייקט זה כדי לקבל את מיקום סמן העכבר בעת יצירת האירוע.
אירועים שונים יכולים להשתמש באותו טיפוס של Delegate. למשל, "MouseUp" ו- "MouseDown" משתמשים שניהם בdelegate הנקרא MouseButtonEventHandler. לעומת זאת, האירוע "MouseMove" משתמש בdelegate מסוג MouseEventHandler. בעת רישום לאירוע מסוים, יש לוודא שהמימוש לטיפול באירוע מתאים לdelegate הנחוץ. במידת הצורך, אם סוג הdelegate אינו ידוע לך, פנה למסמכי התיעוד של WPF.
למרבה המזל, Visual Studio מספק סיוע ביצירת event handler נכון לאירועים אליהם נרשמים. הדרך הפשוטה ביותר לנצל יכולת זו, היא לכתוב את שם האירוע בקובץ הXAML ולאחר מכן להיעזר בהצעות של IntelliSence:
כאשר יוצרים <New Event Handler>, ה-Visual Studio מייצר אוטומטית את הevent handler המתאים בקוד של האפליקציה. שם הhandler יהיה <control name>_<event name>, או במקרה שלנו pnlMainGrid_MouseDown. כדי לנווט לסביבת המימוש, יש ללחוץ על מקש ימני בעכבר על שם האירוע ולבחור באופציה Navigate to Event Handler.
רישום לאירועים בקוד-מאחור (code-behind)
הדרך הנפוצה ביותר להירשם לאירועים היא כפי שהוסבר למעלה, אך לעתים אתה רוצה להירשם לאירוע ישירות מהקוד. זה נעשה באמצעות תחביר =+ של #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());
}
}
}
שוב, אתה צריך לדעת באיזה נציג (delegate) להשתמש, ושוב, Visual Studio יכול לעזור לך בזאת. כשתכתוב:
pnlMainGrid.MouseDown +=
Visual Studio יציע עזרה:
פשוט הקש [Tab] פעמיים על מנת ש-Visual Studio ייצר בשבילך את מטפל האירוע הנכון, ישר מתחת לשיטה (method) הנוכחית, מוכן למימוש. כאשר אתה נרשם לאירועים כך, אינך צריך לעשות זאת ב-XAML.