TOC

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

XAML:

Events in XAML

Dauguma šiuolaikinių UI karkasų, įskaitant WPF yra paremti įvykiais ( event'ais). Visi UI elementai (Button, Label, TextBox, Menu, ...), įskaitant ir "Window", kuris taip pat paveldi Control klasę, pateikia daugybę įvykių (eventų), kuriuos galima sekti (subscrib'inti), ko pasekoje aplikacija žinos kada buvo iškviestas vienas ar kitas įvykis į kurį tada bus galima reguoti (vykdant viena ar kitą kodo gabalą).

Yra daugybė įvykių (eventų) tipų, bet dažniausiai naudojami yra tie kurie reguoja į vartotojo sąveiką su programa naudojant įvesties įrenginius (pelė, klaviatūra, ...). Dauguma UI elementų turi tokius įvykius (eventus) kaip "KeyDown" (klavišo nuspaudima), "KeyUp" (klavišo atleidimas), "MouseDown" (pelės klavišo nuspaudimas), "MouseEnter" (pelės kursoriaus užvedimas ant UI elemento), "MouseLeave"(pelės klavišo išvedimas nuo UI elemento), "MouseUp" , bei keliatas kitų.

Toliau šiek tiek detaliau aptarsime įvykių (event'ų) veikimą WPF programoje, nes tai pakankamai sudėtinga tema, bet dabar svarbu suprasti kaip susieti UI elemevtą (arba kitaip valdiklį (angl.: control)), aprašytą XAML struktūroje, su kodu C# faile (back end'o failu). Atkreipkite dėmesį į tolimesnį pavyzdį:

<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>

Atkreipk dėmesį į tai, kaip mes užprenumeravome (subscribe'inome) "Grid" ui elemento "MouseUp" įvykį (event'ą) įrašant iškviečiamos funkcijos (aprašytos back-end'o faile) pavadinimą. Šį metodą ("pnlMainGrid_MouseUp") aprašome back-end'o kode ( .cs faile ). Šis metodas bus iškviestas kuomet bus paspaustas ir atleidžiamas pelės klavišas ant elemento (pelės klavišo atleidimo metu). C# kodas turėtų atrodyti taip:

private void pnlMainGrid_MouseUp(object sender, MouseButtonEventArgs e)
{
	MessageBox.Show("You clicked me at " + e.GetPosition(this).ToString());
}

"MouseUp" įvykis (event'as) naudoja delegatą kuris vadinasi MouseButtonEventHandler, ir kurį tu prenumeruoji ("subscribe'ini"). Jis turi 2 parametrus: siuntėję ( valdiklį kuris iššaukė įvykį (event'ą) ) ir objektą "MouseButtonEventArgs ", kuris saugo informaciją apie su pelės mygtuku susietais įvykiais (event'ais). Kode mes panaudojame šį objekta tam kad gauti pelės kordinates paspaudimo metu ir pateikti jas vartotojui.

Keli įvykiai (event'ai) gali naudoti tą patį delegato tipa - pavyzdžiui abu "MouseUp" ir "MouseDown" naudoja MouseButtonEventHandler delegatą, nors "MouseMove" įvykis (event'as) naudoja MouseEventHandler delegatą. Aprašant įvykį (eventą) apdorojantį metodą, reikia naudoti tinkamą delegatą, jei nežinai kurį delegatą naudoja konkretų įvykį apdorojantis metodas, visuomet gali tai rasti dokumentacijoje.

Laimei "Visual Studio" padeda mums sukurti tinkamą įvykio (event'o) apdorojimo funkciją konkrečiam įvykiui (event'ui). Papraščiausias būdas tai atlikti - įrašyti XAML faile (failas aprašantis programos UI) įvykio (event'o) pavadinimą ir pasirenkant "naujas įvykio (event'o) apdorojimo metodas" ( angl.: New Event Handler) iš VS "InteliSense" ( visual studio funkcija automatiškai siūlanti kodo pratesimą (na čia toks kaip autocompleatas kaip kad kokiam faceboke kai pradedi rašyt žodį ir tau duoda pasiūlymus) ) pasiūlymų.

Kai iš siūlomų parinkčių pasirinksi <New Event Handler> Visual Studio automatiškai sugeneruos įvykį (eventą) apdorojantį metodą c# back'endo faile. Šis metodas bus pavadintas <control name>_<event name>, mūsų atvieju pnlMainGrid_MouseDown. Paspausk dešinį pelės klavišą ir pasirink Navigate to Event Handler ir Visual studio tave permes į back-end'o kodą.

Prenumeruok įvykį backend'o kode

Viršuje pateiktas įvykių prenumeravimo būdas yra pats populiariausias, bet kartai būna atviejų kuomet reikia prenumeruoti įvykius (event'us) iš backend'o kodo. C#kalboje tai daroma naudojant "+=" sintaksę, taip pridedant įvykio apdorojimo metodą tiesiogiai objekto įvykiui. Štai tokio kodo pavyzdys:

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

	}
}

Kaip ir ankščiau, tau reikia žinoti kurį delegatąnaudoti, kaip ir ankščiau Visual Studio tau padės. Iš karto kai parašysi:

pnlMainGrid.MouseDown +=

Visual Studio tau pasiūlys tinkamą variantą:

Tiesiog spustelk [Tab] du kartus ir Visual Studio sugeneruos teisingą įvykio apdorojimą, iškarto po esamo metodo, paruošta implementavimui(užpildymui kodu). Kuomet prenumeruojate įvykį (eventą) šiuo metodu, nereikia įgyvendinti prenumeratos XAML kode.