2009-08-17 4 views
17

Ich erstelle ein Standardmenü in meiner WPF-Anwendung.WPF Standardbefehle - Wo ist Exit?

Ich weiß, dass ich benutzerdefinierte Befehle erstellen kann, aber ich weiß, dass es auch eine Reihe von Standardbefehlen zum Binden gibt.

Um zum Beispiel eine Datei zu öffnen, ich ApplicationCommands.Open binden soll eine Datei zu schließen, ich binden sollte ApplicationCommands.Close. Es gibt auch eine große Anzahl von EditCommands, ComponentCommands oder Navigation Commands.

Es scheint keinen "Exit" -Befehl zu geben. Ich hätte erwartet, dass es ApplicationCommands.Exit.

Was soll ich an den Menüpunkt "Beenden" binden? Um einen benutzerdefinierten Befehl für etwas zu erstellen, scheint dieses generische einfach falsch zu sein.

Antwort

4

AFAIK gibt es keine ApplicationCommands.Quit oder ApplicationCommands.Exit, so dass ich denke, du wirst es selbst zu schaffen haben ...

Wie auch immer, wenn Sie die MVVM pattern verwenden, RoutedCommands nicht genau handlich sind, Daher ist es besser, eine leichte Alternative wie RelayCommand oder DelegateCommand zu verwenden.

0

Sie können die Text-Eigenschaft eines Befehls ändern, bevor Sie ihn in einem Fenster binden. Dadurch wird der Befehlstext überall in Ihrem UI geändert.

EDIT: dies im Fenster oder App Ctor

6

Nicht wirklich komplex (aber immer noch, M $ saugt dafür nicht). Hier gehen Sie:

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(); 
    } 
} 

Und der Körper der AplicationCloseCommand.CanExecuteChanged Event-Handler nicht sein kann sogar erforderlich.

Sie verwenden es, wie so:

<MenuItem Header="{DynamicResource MenuFileExit}" Command="MyNamespace:MyCommands.ApplicationCloseCommand"/> 

Prost!

(Sie können sich nicht vorstellen, wie es mir lange gedauert hat, diesen Befehl Sachen zu entdecken, mich ...)

0
private void MenuItem_Click(object sender, RoutedEventArgs e) 
    { 
     Application.Current.Shutdown(); 
    } 
+0

Es wäre bevorzugt, wenn Sie eine Erklärung an Ihrem Code hinzugefügt ... – JTG