This article has been localized into Polish by the community.
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.