TOC

This article has been localized into Russian by the community.

XAML:

События в XAML

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

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

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