Опубликован: 13.12.2011 | Доступ: свободный | Студентов: 1021 / 34 | Оценка: 4.29 / 4.57 | Длительность: 13:56:00
Самостоятельная работа 4:

Использование команд в технологиях WPF и Silverlight

< Лекция 8 || Самостоятельная работа 4 || Лекция 9 >
Аннотация: В лабораторной работе будут даны задания для самостоятельного выполнения на закрепление пройденной теоретической части лекции 11, а также рассмотрены 3 примера, способствующие общему видению решения поставленной в лабораторной работе задачи. Для более частных решений опирайтесь на лекцию 8.

Цель лабораторной работы: рассмотреть примеры практического использования стандартных и нестандартных команд. Перевод команд из неактивного состояния в активное и обратно. В качестве примеров команд мы рассмотрим операции Копировать, Вырезать и Вставить, доступные во многих приложениях.

Задания для самостоятельного выполнения

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

Учебный элемент. Использование стандартных и нестандартных команд

Шаг 1. Использование стандартных команд

Задача. Вы хотите, чтобы программа реагировала на команды меню, щелчки по панели инструментов и клавиатурные комбинации.

Решение. Технология WPF включает в себя целый ряд стандартных обработчиков команд, реагирующих на события стандартных элементов управления.

Например, если ассоциировать пункт меню Сору (Копировать) со встроенной командой Сору, она автоматически станет активной, как только фокус перейдет на элемент TextBox.

<Window x: Class ="WpfTextEditor.Windowl" 
    ... > 
  <DockPanel Name="dockPanell" VerticalAlignment="Stretch" 
             HorizontalAlignment="Stretch"> 
    <Menu DockPanel.Dock="Top" Height="Auto"> 
      <MenuItem Header="_Edit"> 
          <MenuItem Header="_Copy" Cammand="Copy"/> 
          <MenuItem Header="_Cut" Cammand="Cut"/> 
          <MenuItem Header="_Paste" Cammand="Paste"/> 
      </MenuItem> 
    </Menu> 
    <ToolBarTray DockPanel.Dock="Top"> 
      <ToolBar > 
        <Button Command="ApplicationCommands.Copy"> 
          <Image Source="Resources\Copy.png" Opacity="l" /> 
        </Button> 
      </ToolBar> 
    </ToolBarTray> 
  </DockPanel> 
</Window> 

Шаг 2. Использование нестандартных команд

Задача. Вы хотите создать собственные команды, специфичные для данного приложения.

Решение. Обычно команды сгруппированы в статических классах, чтобы к ним удобнее было обращаться. Определим две команды:

public class WpfTextEditorCommands 
{ 
    public static RoutedUICommand ExitCommand; 
    public static RoutedUICommand WordWrapCommand; 
    
    static WpfTextEditorCommands () 
    { 
        InputGestureCollection exitInputs = 
            new InputGestureCollection(); 
        exitInputs.Add(new KeyGesture(Key.F4, ModifierKeys.Alt) ) ; 
        ExitCommand = new RoutedUICommand("Exit application", 
            "ExitApplication", 
            typeof(WpfTextEditorCommands), exitInputs); 
        WordWrapCommand = new RoutedUICommand("Word wrap", "Wordwrap", 
            typeof (WpfTextEditorCommands) ) ; 
    } 
} 

Теперь можно связывать эти команды с элементами управления и закреплять их за обработчиками событий:

public partial class Window1:Window
{
  public Window1() 
  {
      InitializeComponent(); 
      // Создать обработчики для наших нестандартных команд 
      CommandBinding cmdBindingExit = new 
          CommandBinding (WpfTextEditorCommands.ExitCommand); 
      cmdBindingExit.Executed += new 
          ExecutedRoutedEventHandler(cmdBindingExit_Executed); 
      CommandBinding cmdBindingWordWrap = new 
          CommandBinding (WpfTextEditorCommands.WordWrapCommand); 
      cmdBindingWordWrap.Executed += new 
          ExecutedRoutedEventHandler(cmdBindingWordWrap_Executed); 
      this.CommandBindings.Add(cmdBindingExit); 
      this.CommandBindings.Add(cmdBindingWordWrap); 
  }

  void cmdBindingWordWrap_Executed(object sender, ExecutedRoutedEventArgs e)
  {
      textBox.TextWrapping = 
           ((textBox.TextWrapping == TextWrapping.NoWrap) ?
                      TextWrapping.Wrap : TextWrapping.NoWrap);
  }

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

Соберем все вместе с помощью XAML-кода:

<Window x:Class="WpfTextEditor.Windowl" 
    ... > 
    <DockPanel Name="dockPanel1" 
               VerticalAlignment="Stretch" 
               HorizontalAlignment="Stretch"> 
        <Menu DockPanel.Dock="Top" Height="Auto"> 
            <MenuItem Header="_Fi1e">
                <MenuItem Header="_Exit" 
                  Command="local:WpfTextEditorCommands.ExitCommand"/>
            </MenuItem> 
            <MenuItem Header="_View"> 
                <MenuItem Header="_Wordwrap" IsCheckable="True" 
                   Name="menuItemWordWrap" 
                   Command="local:WpfTextEditorCommands.WordWrapCommand"/>
            </MenuItem> 
        </Menu> 
        <ToolBarTray DockPanel.Dock="Top"> 
            <ToolBar> 
                <CheckBox IsChecked="{Binding Mode=TwoWay, 
                    ElementName=menuItemWordWrap, Path=IsChecked}"
                    Command="local:WpfTextEditorCommands.WordWrapCommand">
                    <Image Source="Resources\WordWrap.png"
                         OpacityMask="White"/>
                </CheckBox> 
            </ToolBar> 
        </ToolBarTray> 
    </DockPanel> 
</Window> 

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

Шаг 3. Перевод команд из неактивного состояния в активное и обратно

Задача. Вы хотите избирательно переводить команды из неактивного состояния в активное и обратно, в зависимости от состояния приложения.

Решение. Пусть команда Exit (Выход) становится неактивной, когда в текстовое поле введен текст. Внешне это будет проявляться в том, что пункт меню окрасится в серый цвет, а кнопка панели инструментов перестанет действовать.

public partial class Windowl:Window
{ 
  public Windowl()
  {
      InitializeComponent();
      //Создать обработчики для наших нестандартных команд 
      CommandBinding cmdBindingExit =
          new CommandBinding (WpfTextEditor Commands.ExitCommand);
      cmdBindingExit.Executed +=
          new ExecutedRoutedEventHandler(cmdBindingExit_Executed); 
      cmdBindingExit.CanExecute +=
          new CanExecuteRoutedEventHandler(cmdBindingExit_CanExecute);
      //. . . 
  }

  void cmdBindingExit_CanExecute(object sender, CanExecuteRoutedEventArgs e)
  {
    e.CanExecute = textBox.Text.Length == 0;
  }
}

Краткие итоги

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

< Лекция 8 || Самостоятельная работа 4 || Лекция 9 >