Книги онлайн и без регистрации » Разная литература » Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 321 322 323 324 325 326 327 328 329 ... 407
Перейти на страницу:
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). Теперь необходимо разрешить окну выполнять указанные команды, предварительно проверив возможность делать это в текущих обстоятельствах; раз так, можете определить обработчик события для запуска специального кода.

Понадобится наполнить коллекцию CommandBindings, поддерживаемую окном. В разметке XAML потребуется применить синтаксис "свойство-элемент" для определения области Window.CommandBindings, в которую помещаются два определения CommandBinding. Модифицируйте определение Window, как показано ниже:

<Window x:Class="MyWordPad.MainWindow"

  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

  Title="MySpellChecker" Height="331" Width="508"

  WindowStartupLocation ="CenterScreen" >

  <!-- Это информирует элемент управления Window о том, какие

       обработчики вызывать при поступлении команд Open и Save -->

  <Window.CommandBindings>

    <CommandBinding Command="ApplicationCommands.Open"

                    Executed="OpenCmdExecuted"

                    CanExecute="OpenCmdCanExecute"/>

    <CommandBinding Command="ApplicationCommands.Save"

                    Executed="SaveCmdExecuted"

                    CanExecute="SaveCmdCanExecute"/>

  </Window.CommandBindings>

  <!-- Эта панель устанавливает содержимое окна -->

  <DockPanel>

  ...

  </DockPanel>

</Window>

Щелкните правой кнопкой мыши на каждом из атрибутов Executed и CanExecute в редакторе XAML и выберите в контекстном меню пункт Navigate to Event Handler (Перейти к обработчику события). Как объяснялось в главе 24, в результате автоматически сгенерируется заготовка кода для обработчика события. Теперь в файле кода C# для окна должны присутствовать четыре пустых обработчика событий.

Реализация обработчиков события CanExecute будет сообщать окну, что можно инициировать соответствующие события Executed в любой момент, для чего свойство CanExecute входного объекта CanExecuteRoutedEventArgs устанавливается в true:

private void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)

{

  e.CanExecute = true;

}

private void SaveCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)

{

  e.CanExecute = true;

}

Обработчики соответствующего события Executed выполняют действительную работу по отображению диалоговых окон открытия и сохранения файла; они также отправляют данные из TextBox в файл. Начните с импортирования пространств имен System.IO и Microsoft.Win32 в файл кода. Окончательный код прямолинеен:

private void OpenCmdExecuted(object sender, ExecutedRoutedEventArgs e)

{

  // Создать диалоговое окно открытия файла и

1 ... 321 322 323 324 325 326 327 328 329 ... 407
Перейти на страницу:

Комментарии
Минимальная длина комментария - 20 знаков. В коментария нецензурная лексика и оскорбления ЗАПРЕЩЕНЫ! Уважайте себя и других!
Комментариев еще нет. Хотите быть первым?