TOC

This article has been localized into Czech by the community.

XAML:

Události v jazyce XAML

Naprostá většina moderních frameworků pro tvorbu GUI aplikací využívá programování řízené událostmi. Všechny kontrolky, a to včetně okna aplikace samého (okno též dědí ze třídy Control), obsahují celou řadu událostí, na které je možno reagovat. Na tyto události (eventy) je možné napojit vlastní kód. Pokud nastanou, aplikace se to dozví a je tak možné na ně reagovat.

Existuje velké množství různých událostí. Ty nejčastěji používané reagují na interakci uživatele s aplikací, ať už myší či klávesnicí. Na naprosté většině kontrolek naleznete události KeyDown, KeyUp, MouseDown, MouseEnter, MouseLeave, MouseUp a několik dalších.

Podíváme se blíže, jak eventy pracují ve WPF, protože je to komplexní téma. Teď ale potřebujete vědět, jak propojit event kontrolky v XAMLu s částí kódu v Code-Behind souboru. Podívejte se na následující příklad:

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

Povšimněte si, že jsme se na událost MouseUp kontrolky Grid odkázali tak, že jsme zapsali jméno obslužné metody do příslušného atributu. Tuto metodu je nyní potřeba vytvořit v Code-Behind souboru. Metoda musí samozřejmě odpovídat delegátu pro danou událost, v tomto případě následujícím způsobem:

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

Delegát události MouseUp (která, jak název napovídá, reaguje na puštění tlačítka myši uživatelem) je MouseButtonEventHandler, který má dva argumenty. První je sender, což je objekt (kontrolka), který událost způsobil. Druhý se obvykle značí e, v tomto případě jde o objekt typu MouseButtonEventArgs, a obsahuje informace o dané události. V příkladu výše se při vyvolání události podíváme do e, a zjistíme z něj souřadnice kurzoru myši, které sdělíme uživateli.

Různé události (eventy) mohou být obslouženy stejným delegátem události. Například MouseUp i MouseDown využívají oba delegáta MouseButtonEventHandler. Událost "MouseMove" je naopak obsloužena delegátem MouseEventHandler. Proto je při definici metody pro obsluhu událostí třeba znát, který delegát ji používá a v případě pochybností vyhledat tyto informace v dokumentaci.

Naštěstí Visual Studio může pomoci správného delegáta pro obsluhu událostí vygenerovat. Nejjednodušší způsob, jak toho dosáhnout, je napsat jméno události do XAML kódu a další práci přenechat IntelliSense Visual Studia:

Při volbě <New Event Handler> (v české verzi VS IntelliSense překládá jako "Nová obslužná rutina události") vygeneruje Visual Studio příslušnou obslužnou rutinu událostí (event handler) v .cs souboru obsahujícím "Code-behind". Bude se jmenovat <control name>_<event name>, v uvedeném příkladě tedy pnlMainGrid_MouseDown. Ke zdrojovému kódu pro obsluhu události se lze dostat stisknutím pravého tlačítka myši nad názvem události a výběrem volby Navigate to Event Handler (v české mutaci VS "Přejít k definici") z vyskakovací nabídky. (Pozn. překl.: stejně dobře poslouží stisk tlačítka F12, je-li kurzor umístěn v názvu události.)

Napojení na událost v Code-Behind souboru

Nejčastější způsob obsluhy událostí jsme popsali výše, nicméně někdy se hodí napojit se na obsluhu události přímo z Code-Behind souboru. K tomu se používá C# operátor +=, kterým se obslužná metoda přímo vloží (přidá) do Eventu příslušného objektu. Pro plné vysvětlení této syntaxe je vhodné přečíst si nějaký článek přímo o C# reagování na události. Nicméně, pro porovnání s napojením přes XAML, které už jsme viděli, uvádíme příklad:

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

	}
}

A opět, je třeba vědět, který delegát použít, a Visual Studio nám s tím opět pomůže. Jakmile napíšete:

pnlMainGrid.MouseDown +=

Vyskočí intellisense s následující nabídkou:

Nyní stačí jednoduše stisknout dvakrát klávesu [Tab] (tabelátor) a Visual Studio automaticky vytvoří správnou obslužnou metodu, a to hned pod stávající metodu (pod tu, do níž zrovna píšeme kód). Tuto novou obslužnou metodu je ihned možné naprogramovat. Pokud se na událost napojíme tímto způsobem, tak samozřejmě není potřeba dělat to v XAMLu.