TOC

This article is currently in the process of being translated into Ukrainian (~86% done).

XAML:

Events in 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 зробити решту за вас:

When you select <New Event Handler> Visual Studio will generate an appropriate event handler in your Code-behind file. It will be named <control name>_<event name>, in our case pnlMainGrid_MouseDown. Right-click in the event name and select Navigate to Event Handler and VS will take you right to it.

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

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

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.

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!