Подтвердить что ты не робот

Пример пользовательского шаблона WPF

Я сделал некоторые WPF-программы, и одна вещь, которую я никогда не получал, - это шаблон команды. Кажется, что каждый пример для встроенных, редактирования, вырезания, вставки. У кого-нибудь есть пример или предложение наилучшей практики для пользовательских команд?

4b9b3361

Ответ 1

Ага! Вопрос, на который я могу ответить! Во-первых, я должен упомянуть, что мне было легче определить и подключить команды в коде, а не в XAML. Это позволяет мне подключать обработчики для команд немного более гибко, чем любой подход XAML.

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

public static class CommandBank
{
  /// Command definition for Closing a window
  public static RoutedUICommand CloseWindow { get; private set; }

  /// Static private constructor, sets up all application wide commands.
  static CommandBank()
  {
    CloseWindow = new RoutedUICommand();
    CloseWindow.InputGestures.Add(new KeyGesture(Key.F4, ModifierKeys.Alt));
    // ...
  }

Теперь, поскольку я хотел сохранить код вместе, используя только подход кода к Commands, я могу поместить следующие методы в класс выше:

/// Closes the window provided as a parameter
public static void CloseWindowExecute(object sender, ExecutedRoutedEventArgs e)
{
  ((Window)e.Parameter).Close();
}

/// Allows a Command to execute if the CommandParameter is not a null value
public static void CanExecuteIfParameterIsNotNull(object sender, CanExecuteRoutedEventArgs e)
{
  e.CanExecute = e.Parameter != null;
  e.Handled = true;
}

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

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

public partial class SimpleWindow : Window
{
  private void WindowLoaded(object sender, RoutedEventArgs e)
  {
    // ...
    this.CommandBindings.Add(
      new CommandBinding(
        CommandBank.CloseWindow,
        CommandBank.CloseWindowExecute,
        CommandBank.CanExecuteIfParameterIsNotNull));

    foreach (CommandBinding binding in this.CommandBindings)
    {
       RoutedCommand command = (RoutedCommand)binding.Command;
       if (command.InputGestures.Count > 0)
       {
         foreach (InputGesture gesture in command.InputGestures)
         {
           var iBind = new InputBinding(command, gesture);
           iBind.CommandParameter = this;
           this.InputBindings.Add(iBind);
         }
       }
    }

    // menuItemExit is defined in XAML
    menuItemExit.Command = CommandBank.CloseWindow;
    menuItemExit.CommandParameter = this;
    // ...
  }

  // ....
}

Затем я также позже обработчики событий для событий WindowClosing и WindowClosed, я рекомендую вам сделать фактическую реализацию команд как можно более малой и общей. Как и в этом случае, я не пытался помещать код, который пытается остановить закрытие окна, если есть несохраненные данные, я твердо сохранил этот код внутри события WindowClosing.

Сообщите мне, есть ли у вас какие-либо последующие вопросы.:)

Ответ 2

Я написал о связке ресурсов в командах WPF вместе с примером в прошлом году на http://blogs.vertigo.com/personal/alanl/Blog/archive/2007/05/31/commands-in-wpf.aspx

Вставка здесь:

Пример главы Адама Натанса о важных новых концепциях в WPF: Команды

Статья MSDN: шаблон команды в WPF

Keyvan Nayyeri: как добавить команды в пользовательский элемент управления WPF

Ян Гриффитс: вход, команды и обработчики Avalon

Википедия: Шаблон команды

Библиотека MSDN: командный обзор

Библиотека MSDN: Класс CommandBinding

Библиотека MSDN: инструкции по вводу и командам

Библиотека MSDN: Редактирование класса команд

Библиотека MSDN: класс MediaCommands

Библиотека MSDN: класс ApplicationCommands

Библиотека MSDN: класс NavigationCommands

Библиотека MSDN: Класс ComponentCommands

Также похороны в образцах WPF SDK, там хороший образец редактирования RichTextBox, который я расширил. Вы можете найти его здесь: RichTextEditor.zip

Ответ 4

Дело в XAML заключается в том, что это нормально для "простых" программ, но, к сожалению, это плохо работает, когда вы хотите делать что-то вроде общих функций. Предположим, что у вас есть несколько классов и пользовательский интерфейс, все из которых имеют команды, которые никогда не были отключены, вам нужно написать метод CanAlwaysExecute для каждого окна или UserControl! Это просто не очень СУХОЙ.

Прочитав несколько блогов и попробовав несколько вещей, я сделал выбор, чтобы сделать XAML чисто о внешности, стилях, анимации и триггерах. Все мои привязки обработчиков событий и команды теперь находятся в коде.:)

Другой способ - это привязка ввода, чтобы их можно было поймать, фокус должен быть на объекте, который содержит привязки ввода. Например, чтобы иметь короткий разрез, который вы можете использовать в любое время (например, F1, чтобы открыть справку), эта привязка ввода должна быть установлена ​​в объекте Window, так как это всегда имеет фокус, когда ваше приложение активно. Использование метода кода должно сделать это проще, даже если вы начнете использовать UserControls, которые могут захотеть добавить привязки ввода к их родительскому окну.