This article has been localized into Bulgarian by the community.
Събития в XAML
Повечето съвременни UI рамки се управляват от събития, такъв е и WPF. Всички контроли, включително Window (който също наследява клас Control) разкриват обхват от събития за които можете да се абонирате. Можете да се абонирате за тези събития, което означава, че приложението Ви ще бъде уведомено когато те се случат и Вие можете да реагирате на тях.
Има много типове събития, но някои от най-общо използваните се там да отговарят на взаимодействието на потребителя с приложението Ви чрез използване на мишка и клавиатура. В повечето контроли ще откриете събития като KeyDown, KeyUp, MouseDown, MouseEnter, MouseLeave, MouseUp и няколко други.
Ще погледнем по-отблизо как работят събитията в WPF, т.като това е сложна тема, но засега трябва да знаете как да свържете контролно събитие в XAML към парче код във Вашия Code-behind файл. Погледнете този пример:
<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>
Забележете как се абонирахме за събитието MouseUp на Grid като написахме името на метода. Този метод трябва да е дефиниран в code-behind, като се използва правилния подпис на събитието. В този случай трябва да изглежда така:
private void pnlMainGrid_MouseUp(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("You clicked me at " + e.GetPosition(this).ToString());
}
Събитието MouseUp използва делегирано наречено MouseButtonEventHandler, към което се абонирате. Има два параметъра, изпращач (контрола който стартира събитието) и обекта MouseButtonEventArgs, който ще съдържа полезна информация. Използваме го в примера за да вземем позицията на курсора на мишката и да кажем на потребителя за това.
Няколко събития може да използват същия делегиращ тип - например MouseUp и MouseDown използват делегиращия MouseButtonEventHandler, докато събитието MouseMove използва делегиращия MouseEventHandler. Когато дефинирате метод за обработка на събития трябва да знаете кой делегиращ се използва и ако не знаете това можете да го потърсите в документацията.
За щастие Visual Studio може да ни помогне да създадем правилния обработващ събитието за съответното събитие. Най-лесния начин да направите това е просто да напишете името на събитието в XAML и да оставите IntelliSense от VS да свърши останалото вместо Вас.
Когато избирате <New Event Handler> Visual Studio ще създаде подходящия обработващ събитието във Вашия Code-behind файл. Той ще бъде наречен <control name>_<event name>, в нашия случай pnlMainGrid_MouseDown. Цъкнете с десния бутон върху името на събитието и изберете Navigate to Event Handler и VS ще Ви отведе точно върху него.
Абониране за събитие от Code-behind
Най-често срещания начин за абониране на събития е обяснен по-горе, но може да има случаи където да искате са се абонирате за събитие вместо това от Code-behind. Това става чрез използване на C# синтаксиса += където Вие прибавяте обработващ събитието директно към обекта. Пълното обяснение на това се намира в специален пример на C#, но за сравнение ето един пример:
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());
}
}
}
Още веднъж, Вие трябва да знаете кой делегиращ да използвате, и още веднъж Visual Studio може да ви помогне за това. Веднага щом напишете:
pnlMainGrid.MouseDown +=
Visual Studio ще Ви предложи подкрепа:
Просто натиснете клавиша [Tab] два пъти за да накарате Visual Studio да създаде правилния обработващ на събитията вместо Вас, точно под текущия метод, готово за използване. Когато се абонирате за събития като това не трябва да го правите в XAML.