TOC

This article is currently in the process of being translated into Croatian (~66% done).

XAML:

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

The most common way to subscribe to events is explained above, but there may be times where you want to subscribe to the event directly from Code-behind instead. This is done using the += C# syntax, where you add an event handler to event directly on the object. The full explanation of this belongs in a dedicated C# example, but for comparison, here's an example:

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());
		}

	}
}

Once again, you need to know which delegate to use, and once again, Visual Studio can help you with this. As soon as you write:

pnlMainGrid.MouseDown +=

Visual Studio will offer its assistance:

Simply press the [Tab] key twice to have Visual Studio generate the correct event handler for you, right below the current method, ready for implementation. When you subscribe to the events like this, you don't need to do it in XAML.