TOC

This article has been localized into Polish by the community.

XAML:

Zdarzenia w XAML

Większość nowoczesnych frameworków UI bazuje na wydarzeniach i nie inaczej ma się to w WPF. Wszystkie kontrolki, wliczając w to Window (okno, dziedziczące po klasie Control) udostępniają zakres wydarzeń do których można się subskrybować. Oznaca to, że twoja aplikacja będzie powiadamiana kiedy wydarzenie do którego się subskrybujesz wystąpi, a Ty możesz na nie zareagować.

Jest wiele różnych typów zdarzeń, jednak tylko kilka z najpopularniejszych jest używanych do interakcji użytkownika z aplikacją za pomocą klawiatury i myszy. Na większości kontrolek znajdziesz takie zdarzenia jak KeyDown, KeyUp, MouseDown, MouseEnter, MouseLeave, MouseUp i kilka innych.

Przyjrzymy się bliżej w jaki sposób działają zdarzenia (events) w WPF, ponieważ jest to złożony temat na razie musisz dowiedzieć się jak połączyć zdarzenie sterujące w XAML z fragmentem kodu napisanym w C#. Poniżej znajduje się przykład:

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

Zwróć uwagę na to, jak podłączamy się pod zdarzenie MouseUp dla Grid. Robimy to poprzez samo napisanie nazwy metody, która znajduje się w kodzie widoku (code-behind - plik zawierający ten kod standardowo kończy się rozszerzeniem .xaml.cs dla języka C#). Co ważne, sygnatura tej metody powinna być odpowiednia dla danego zdarzenia (MouseUp). W naszym przypadku powinno to wyglądać następująco:

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

Zdarzenie MouseUp używa delegata MouseButtonEventHandler, do którego subskrybujesz. Ma on dwa parametry, sender - kontrolka, która wyzwoliła zdarzenie oraz MouseButtonEventArgs - dodatkowe informacje na temat zdarzenia. Użyjemy ich do wyciągnięcia informacji na temat pozycji kursora myszki.

Wiele zdarzeń może używać tego samego delegata. Dla przykładu: MouseUp i MouseDown używają delegata MouseButtonEventHandler, podczas gdy zdarzenie MouseMove używa MouseEventHandler. Kiedy piszesz funkcję realizującą zdarzenie musisz wiedzieć jakie parametry są przekazywane przez delegata. Tę informację zawsze możesz znaleźć w dokumentacji.

Na całe szczęście Visual Studio pomaga nam w generowaniu uchwytów dla zdarzeń. Najłatwiej zrobić to poprzez wpisanie nazwy zdarzenia w XAML i wybranie odpowiedniej pozycji w podpowiedziach (IntelliSense).

Kiedy wybierzesz <New Event Handler> Visual Studio wygeneruje odpowiedni uchwyt zdarzenia w kodzie widoku (code-behind). Domyślnie zostanie on nazwany <nazwa kontrolki>_<nazwa zdarzenia>. W naszym przypadku pnlMainGrid_MouseDown. Klikajac prawym przyciskiem myszki na nazwie zdarzenia i wybierając pozycję Navigate to Event Handler Visual Studio przekieruje nas do funkcji w kodzie widoku (code-behind).

Subskrybowanie zdarzeń z kodu źródłowego widoku (Code-behind)

Najczęstsza metoda subskrypcji zdarzeń jest opisana powyżej, istnieje jednak również możliwość subskrybowania zdarzeń bezpośrednio z kodu źródłowego widoku (code-behind). Służy do tego składnia C# +=, gdzie dodaje się metodę obsługującą dane zdarzenie do zdarzenia dla konkretnego obiektu. Pełne objaśnienie zasługuje na osobny artykuł, poniżej znajduje się przykład dla porównania:

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

	}
}

Nie musisz wiedzieć, którego delegata użyć, Visual Studio może Ci w tym pomóc. Jak tylko napiszesz:

pnlMainGrid.MouseDown +=

Visual Studio zaproponuje pomoc:

Podwójne naciśnięcie klawisza [Tab] wygeneruje poprawną metodę obsługującą zdarzenie, gotową do implementacji. Gdy subskrybujesz zdarzenia w ten sposób, nie musisz tego robić w XAML.