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

Стандартные команды WPF - где выходить?

Я создаю стандартное меню в своем приложении WPF.

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

Например, чтобы открыть файл, я должен привязать к ApplicationCommands.Open, чтобы закрыть файл, который я должен привязать к ApplicationCommands.Close. Также существует большое количество EditCommands, ComponentCommands или NavigationCommands.

Кажется, что нет команды "Выход". Я бы ожидал, что там будет ApplicationCommands.Exit.

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

4b9b3361

Ответ 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();
    }