TOC

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

Commands:

Implementing a custom WPF Command

В прошлой статье, мы рассмотрели несколько путей использования встроенных в WPF команд, но конечно вы можете написать собственные. Это весьма просто, и как только вы закончите, то сможете использовать свои команды совсем как встроенные.

Простейший способ создания команды это сделать static класс который будет содержать команды. Каждая команда будет добавлена в этот класс в качестве статического поля, позволяя вам использовать их в приложении. Так как WPF, по непонятным причинам, не имеет встроенных команд Exit/Quit (Выход), я решил создать такую для нашего примера:

<Window x:Class="WpfTutorialSamples.Commands.CustomCommandSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:self="clr-namespace:WpfTutorialSamples.Commands"
        Title="CustomCommandSample" Height="150" Width="200">
    <Window.CommandBindings>
        <CommandBinding Command="self:CustomCommands.Exit" CanExecute="ExitCommand_CanExecute" Executed="ExitCommand_Executed" />
    </Window.CommandBindings>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Menu>
            <MenuItem Header="File">
                <MenuItem Command="self:CustomCommands.Exit" />
            </MenuItem>
        </Menu>
        <StackPanel Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center">
            <Button Command="self:CustomCommands.Exit">Exit</Button>
        </StackPanel>
    </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Input;

namespace WpfTutorialSamples.Commands
{
	public partial class CustomCommandSample : Window
	{
		public CustomCommandSample()
		{
			InitializeComponent();
		}

		private void ExitCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
		{
			e.CanExecute = true;
		}

		private void ExitCommand_Executed(object sender, ExecutedRoutedEventArgs e)
		{
			Application.Current.Shutdown();
		}
	}

	public static class CustomCommands
	{
		public static readonly RoutedUICommand Exit = new RoutedUICommand
			(
				"Exit",
				"Exit",
				typeof(CustomCommands),
				new InputGestureCollection()
				{
					new KeyGesture(Key.F4, ModifierKeys.Alt)
				}
			);

		//Define more commands here, just like the one above
	}
}

В разметке я добавил простой интерфейс: меню и кнопка. Оба они используют нашу команду Exit. Эта команда создана в коде в нашем CustomCommands классе, и затем указана в коллекции окна CommandBindings, где мы присвоили события для выполнения действий и проверки возможности выполнения.

Все как в примерах прошлых статей, кроме того что мы указывает команду из нашего кода (используя пространство имён "self" определённое сверху) вместо встроенных команд.

В нашем коде, первый обработчик позволяет команде быть выполненной в любой момент, обычное дело для команды выхода, а другой вызывает метод Shutdown который выключит наше приложение. Довольно просто.

Как уже объяснено, мы создали нашу команду Exit как статическое поле класса CustomCommands. Есть несколько путей добавления и присвоения свойств команд, но я выбрал самый компактный (могло быть еще компактнее, помести я всё в одну линию, но это не читабельно) когда мы присвоили все это в конструкторе. Эти параметры это текст/пометка команды, имя, тип владельца и InputGestureCollection позволяющий определить стандартные горячие клавиши для команды (Alt+F4).

Сводка

Создать свою команду WPF почти так же просто как использовать встроенные, и это позволит вам использовать команды для любых целей вашего приложения. Вот так легко команды позволяют использовать одно действие во многих местах, как было показано в примере этой статьи.

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!