This article is currently in the process of being translated into Croatian (~94% done).
Events in XAML
Većina modernih UI frameworka su pogonjena sa eventima, pa tako i WPF. Sve kontrole, uključujući prozor ( Koji isto nasljeđuje Kontrolnu klasu) prikazuje raspon evenata na koji se možete pretplatiti. Možete se pretplatiti na evente, što znači da će vaša aplikacija biti obavještena kada se oni dogode te možete reagirati na njih.
Postoje mnoge vrste evenata, ali najviše korišteni su oni koji odgovaraju na korisnikovu interakciju sa vašom aplikacijom koristeći miš ili tipkovnicu. U većini kontrola naći ćete evente kao što su "KeyDown", "KeyUp", "MouseDown", "MouseEnter", "MouseLeave", "MouseUp" i nekoliko ostalih.
Više ćemo se fokusirati na koji način eventi rade u WPFu, pošto je ovo kompleksna tema, ali za sada, morate znati kako povezati event u XAML u dio koda u vašoj "Code-behind" datoteci. Pogledajte u sljedeći primjerak:
<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>
Uočite kako smo se pretplatili na event "MouseUp" u Grid-u upisivanjem ime metode. Ova metoda mora biti definirana u "code-behind", koristeći ispravan potpis eventa. U ovom slučaju bi to trebalo izgledati ovako:
private void pnlMainGrid_MouseUp(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("You clicked me at " + e.GetPosition(this).ToString());
}
"MouseUp" event koristi delegat imenom "MouseButtonEventHandler" na koji se pretplatite. Ima dva parametra, "sender" (kontrola koja je uzbudila event) i "MouseButtonEventArgs" objekt koji sadrži korisne informacije. Koristimo ga u ovom primjeru kako bi dobili poziciju strelice miša i obavjestili korisnika o tome.
Nekoliko evenata može koristiti isti tip. Naprimjer, "MouseUp" i "MouseDown" zajedno koriste "MouseButtonEventHandler" delegat, dok "MouseMove" event koristi "MouseEventHandler" delegat. Kada definiramo "Event handler" metodu, morate znati koji delegat je koristi, a ako ne znate, možete pogledati u dokumentaciji.
Na sreću, Visual Studio vam može pomoći pri generiranju ispravnog "event handlera" za event. Najlakši način da to učinite je da jednostavno napišete ime eventa u "XAML" i pustite IntelliSense od Visual Studia da napravi ostatak za vas:
Kada izaberete <New Event Handler> Visual Studio će generirati odgovarajući event handler u vašoj "Code-behind" datoteci. Biti će nazvana <control name>_<event name> , u našem slučaju pnlMainGrid_MouseDown. Desni klik u nazivu eventa i odaberite Navigate to Event Handler i Visual Studio će vas odvesti točno u to.
Subscribing to an event from Code-behind
Uobičajeni način za pretplatiti se na događaje je opisan u prethodnom dijelu, ali postoje situacije kada se želite pretplatiti na neki događaj izravno iz pozadinskog koda. Ovo se radi s pomoću += C# sintakse gdje dodajete rukovatelja događajima događaju, izravno na objekt. Potpuno objašnjenje ovoga bi spadalo u poseban C# primjer, ali usporedbe radi evo primjera:
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());
}
}
}
Morate znati koji deleget koristiti i Visual Studio vam u tome može pomoći. Čim napišete:
pnlMainGrid.MouseDown +=
Visual Studio will offer its assistance:
Samo pritisnite Tab tipku dva puta kako bi vam Visual Studio izgenerirao ispravnog rukovatelja događajima, odmah ispod trenutne metode i spremnog za implementaciju. Kada se prijavljujete na događaje na ovaj način nije potrebno to napraviti u XAML-u.