Ответ 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.
Сообщите мне, есть ли у вас какие-либо последующие вопросы.:)