TOC

This article has been localized into Ukrainian by the community.

XAML:

Події в XAML

Більшість сучасних UI фреймворків подійно-орієнтовані, так само й WPF. Всі елементи керування, включаючи Windows(який також наслідує клас 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 переведе нас прямо до неї.

Підписка на подію з фонового коду

Найбільш поширений спосіб підписки на події пояснений зверху, але бувають випадки, коли потрібно підписатися на подію прямо з фонового коду. Це робиться за допомогою += С# синтаксису, де ви додаєте обробник до події прямо як об'єкт. Повне пояснення належить присвяченому С# прикладу, але для порівняння ось приклад:

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] двічі, щоб VS згенерувала правильний обробник події для вас. Прямо внизу цього методу команда готова до реалізації. Коли підписуватися на події таким чином, то не потрібно робити цього в XAML.