Стандартные команды WPF - где выходить?
Я создаю стандартное меню в своем приложении WPF.
Я знаю, что могу создавать пользовательские команды, но я знаю, что есть также набор стандартных команд для привязки.
Например, чтобы открыть файл, я должен привязать к ApplicationCommands.Open, чтобы закрыть файл, который я должен привязать к ApplicationCommands.Close. Также существует большое количество EditCommands, ComponentCommands или NavigationCommands.
Кажется, что нет команды "Выход". Я бы ожидал, что там будет ApplicationCommands.Exit.
Что мне нужно привязать к пункту меню "Выход"? Чтобы создать пользовательскую команду для чего-то, этот общий просто кажется неправильным.
Ответы
Ответ 1
AFAIK там нет ApplicationCommands.Quit или ApplicationCommands.Exit, поэтому я думаю, вам нужно будет создать его самостоятельно...
В любом случае, если вы используете шаблон MVVM, RoutedCommands не совсем удобны, поэтому лучше использовать легкую альтернативу, например RelayCommand или DelegateCommand.
Ответ 2
К сожалению, нет предопределенных ApplicationCommands.Exit. Добавление одного в WPF было предложено в Microsoft Connect в 2008 году: http://connect.microsoft.com/VisualStudio/feedback/details/354300/add-predefined-wpf-command-applicationcommands-exit. Однако элемент отмечен закрытым/отложенным.
Майк Таути обсудил, как создать свою собственную команду Exit в статье в своем блоге.
Ответ 3
Не тот комплекс на самом деле (но все же, M $засасывает, не предоставляя его). Вот вы:
public static class MyCommands
{
private static readonly ICommand appCloseCmd = new ApplicationCloseCommand();
public static ICommand ApplicationCloseCommand
{
get { return appCloseCmd; }
}
}
//===================================================================================================
public class ApplicationCloseCommand : ICommand
{
public event EventHandler CanExecuteChanged
{
// You may not need a body here at all...
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public bool CanExecute(object parameter)
{
return Application.Current != null && Application.Current.MainWindow != null;
}
public void Execute(object parameter)
{
Application.Current.MainWindow.Close();
}
}
И тело обработчика события AplicationCloseCommand.CanExecuteChanged
может быть даже не нужно.
Вы используете его так:
<MenuItem Header="{DynamicResource MenuFileExit}" Command="MyNamespace:MyCommands.ApplicationCloseCommand"/>
Ура!
(Вы не можете себе представить, сколько времени мне понадобилось, чтобы открыть этот материал Command...)
Ответ 4
Вы можете изменить свойство Text для команды, прежде чем связывать ее в окне. Это изменит текст команды везде, где он появится в вашем ui.
EDIT: сделайте это для закрытия в окне или приложении ctor
Ответ 5
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
Application.Current.Shutdown();
}