Чтение онлайн

на главную - закладки

Жанры

Язык программирования C#9 и платформа .NET5
Шрифт:

<Menu DockPanel.Dock ="Top" HorizontalAlignment="Left" Background="White"

BorderBrush ="Black">

<MenuItem Header="_File" Click ="FileExit_Click" >

<MenuItem Header ="_Exit" MouseEnter ="MouseEnterExitArea"

MouseLeave ="MouseLeaveArea"

Click ="FileExit_Click"/>

</MenuItem>

<!-- Новые пункты меню с командами -->

<MenuItem Header="_Edit">

<MenuItem Command ="ApplicationCommands.Copy"/>

<MenuItem Command ="ApplicationCommands.Cut"/>

<MenuItem Command ="ApplicationCommands.Paste"/>

</MenuItem>

<MenuItem Header="_Tools">

<MenuItem Header ="_Spelling Hints"

MouseEnter ="MouseEnterToolsHintsArea"

MouseLeave ="MouseLeaveArea"

Click ="ToolsSpellingHints_Click"/>

</MenuItem>

</Menu>

Обратите

внимание, что свойству
Command
каждого подэлемента в меню Edit присвоено некоторое значение. В результате пункты меню автоматически получают корректные имена и горячие клавиши (например, <Ctrl+C> для операции вырезания) в пользовательском интерфейсе меню, и приложение теперь способно копировать, вырезать и вставлять текст без необходимости в написании процедурного кода.

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

Подключение команд к произвольным действиям

Если объект команды нужно подключить к произвольному событию (специфичному для приложения), то придется прибегнуть к написанию процедурного кода. Задача несложная, но требует чуть больше логики, чем можно видеть в XAML. Например, пусть необходимо, чтобы все окно реагировало на нажатие клавиши <F1>, активизируя ассоциированную с ним справочную систему. Также предположим, что в файле кода для главного окна определен новый метод по имени

SetFICommandBinding
, который вызывается внутри конструктора после вызова
InitializeComponent
:

public MainWindow

{

InitializeComponent;

SetF1CommandBinding;

}

Метод

SetFICommandBinding
будет программно создавать новый объект
CommandBinding
, который можно применять всякий раз, когда требуется привязать объект команды к заданному обработчику событий в приложении. Сконфигурируйте объект
CommandBinding
для работы с командой
ApplicationCommands.Help
, которая автоматически выдается по нажатию клавиши <F1>:

private void SetF1CommandBinding

{

CommandBinding helpBinding = new CommandBinding(ApplicationCommands.Help);

helpBinding.CanExecute += CanHelpExecute;

helpBinding.Executed += HelpExecuted;

CommandBindings.Add(helpBinding);

}

Большинство

объектов
CommandBinding
будет обрабатывать событие
CanExecute
(которое позволяет указать, инициируется ли команда для конкретной операции программы) и событие
Executed
(где можно определить код, подлежащий выполнению после того, как команда произошла). Добавьте к типу, производному от
Window
, следующие обработчики событий (форматы методов регламентируются ассоциированными делегатами):

private void CanHelpExecute(object sender, CanExecuteRoutedEventArgs e)

{

// Если нужно предотвратить выполнение команды,

// то можно установить CanExecute в false.

e.CanExecute = true;

}

private void HelpExecuted(object sender, ExecutedRoutedEventArgs e)

{

MessageBox.Show("Look, it is not that difficult. Just type something!",

"Help!");

}

В предыдущем фрагменте кода метод

CanHelpExecute
реализован так, что справка по нажатию <
F1
> всегда разрешена; это делается путем возвращения
true
. Однако если в определенных ситуациях справочная система отображаться не должна, то необходимо предпринять соответствующую проверку и возвращать
false
. Созданная "справочная система", отображаемая внутри
HelpExecute
, представляет собой всего лишь обычное окно сообщения. Теперь можете запустить приложение. После нажатия <F1> появится ваше окно сообщения.

Работа с командами Open и Save

Чтобы завершить текущий пример, вы добавите функциональность сохранения текстовых данных во внешнем файле и открытия файлов

*.txt
для редактирования. Можно пойти длинным путем, вручную добавив программную логику, которая включает и отключает пункты меню в зависимости от того, имеются ли данные внутри
TextBox
. Тем не менее, для сокращения усилий можно прибегнуть к услугам команд.

Начните с обновления элемента

MenuItem
, который представляет меню File верхнего уровня, путем добавления двух новых подменю, использующих объекты
Save
и
Open
класса
ApplicationCommands
:

<MenuItem Header="_File">

<MenuItem Command ="ApplicationCommands.Open"/>

<MenuItem Command ="ApplicationCommands.Save"/>

<Separator/>

<MenuItem Header ="_Exit"

MouseEnter ="MouseEnterExitArea"

MouseLeave ="MouseLeaveArea" Click ="FileExit_Click"/>

</MenuItem>

Вспомните, что все объекты команд реализуют интерфейс

ICommand
, в котором определены два события (
CanExecute
и
Executed
). Теперь необходимо разрешить окну выполнять указанные команды, предварительно проверив возможность делать это в текущих обстоятельствах; раз так, можете определить обработчик события для запуска специального кода.

Поделиться:
Популярные книги

Идеальный мир для Лекаря 17

Сапфир Олег
17. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 17

Столичный доктор. Том III

Вязовский Алексей
3. Столичный доктор
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Столичный доктор. Том III

Камень. Книга восьмая

Минин Станислав
8. Камень
Фантастика:
фэнтези
боевая фантастика
7.00
рейтинг книги
Камень. Книга восьмая

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Князь Мещерский

Дроздов Анатолий Федорович
3. Зауряд-врач
Фантастика:
альтернативная история
8.35
рейтинг книги
Князь Мещерский

Черный Маг Императора 6

Герда Александр
6. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
7.00
рейтинг книги
Черный Маг Императора 6

Всплеск в тишине

Распопов Дмитрий Викторович
5. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Всплеск в тишине

Камень. Книга 3

Минин Станислав
3. Камень
Фантастика:
фэнтези
боевая фантастика
8.58
рейтинг книги
Камень. Книга 3

Мастер 2

Чащин Валерий
2. Мастер
Фантастика:
фэнтези
городское фэнтези
попаданцы
технофэнтези
4.50
рейтинг книги
Мастер 2

СД. Том 17

Клеванский Кирилл Сергеевич
17. Сердце дракона
Фантастика:
боевая фантастика
6.70
рейтинг книги
СД. Том 17

Варлорд

Астахов Евгений Евгеньевич
3. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Варлорд

Проект ’Погружение’. Том 1

Бредвик Алекс
1. Проект ’Погружение’
Фантастика:
фэнтези
рпг
постапокалипсис
5.00
рейтинг книги
Проект ’Погружение’. Том 1

Отборная бабушка

Мягкова Нинель
Фантастика:
фэнтези
юмористическая фантастика
7.74
рейтинг книги
Отборная бабушка

Дорога к счастью

Меллер Юлия Викторовна
Любовные романы:
любовно-фантастические романы
6.11
рейтинг книги
Дорога к счастью