TOC

This article has been localized into Russian by the community.

XAML:

События в XAML

Большинство современных GUI фреймворков (включая WPF) основаны на событиях. Все элементы управления, включая Window (наследует класс Control) поддерживают множество различных событий, которые можно активировать. Вы можете "подписаться" на эти события, в результате, приложение будет уведомлено при наступлении событий и Вы сможете на них среагировать. P.S. И везде заменить "Окно" на "Window". Читать "Window" приятнее, чем "Окно".

Существуют различные виды событий, но одни из наиболее часто используемых являются те, которые реагируют на взаимодействие пользователя с приложением, используя мышь либо клавиатуру. Большинство элементов управления могут обрабатывать такие события, как: KeyDown, KeyUp, MouseDown, MouseEnter, MouseLeave, MouseUp и другие.

Мы подробно рассмотрим работу событий в WPF, так как данная тема является сложной, но для начала Вам необходимо узнать, как связать событие элемента управления в XAML с логикой в CodeBehind. Взгляните на этот пример:

<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 путем (вписали название метода). Этот метод должен быть определен в CodeBehind, согласно правилам. В таком случае, определение метода будет выглядеть следующим образом:

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

Событие MouseUp, на которое вы "подписались", использует делегат MouseButtonEventHandler. Он содержит два входных параметра: sender ("отправитель", элемент, который среагировал на событие) и объект MouseButtonEventArgs (который будет содержать достаточно полезную информацию). Мы использовали этот объект для того, чтобы получить позицию курсора мыши и передать данную информацию пользователю.

Несколько событий могут пользоваться делегатами одного типа, например события MouseUp и MouseDown используют делегат MouseButtonEventHandler, тогда как событие MouseMove - MouseEventHandler. Когда Вы определяете функцию обработчика события, Вам необходимо знать, какой тип делегата должен быть использован. Если же Вы этого не знаете, можете заглянуть в официальную документацию.

К счастью, Visual Studio может нам в этом помочь, генерируя необходимый обработчик события автоматически. Самый простой способ сделать это - просто определить название события в XAML и дать IntelliSense (система автодополнения Visual Studio) всю работу сделать за вас:

При выборе <New Event Handler> Visual Studio сгенерирует подходящий обработчик событий в файле CodeBehind. Он будет назван <control name>_<event name>, в Вашем случае - pnlMainGrid_MouseDown. Нажав правую кнопку мыши на названии события и выбрав Navigate to Event Handler Visual Studio откроет обработчик в CodeBehind.

Подписка на событие в CodeBehind

Выше был представлен самый распространенный способ подписки на события, но может так случиться, что Вы захотите реализовать это напрямую из CodeBehind. Это можно сделать с помощью 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.

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!