2012-04-06 2 views
1

Dieses WPF-Programm zeigt ein ContextMenu an, das ein MenuItem mit dem Namen 'Exit' hostet, zusammen mit einem leeren Fenster. Die Auswahl von "Beenden" sollte den Prozess beenden, aber es schließt nur das Window und ContextMenu. Ich möchte dieses Programm nicht gewaltsam beenden, aber es sauber beenden.Application.Shutdown() fehlschlägt von ContextMenu

Warum ruft das Aufrufen von Application.Shutdown() im Click-Ereignishandler das Programm nicht herunter?

using System; 
using System.Windows; 
using System.Windows.Controls; 

class MyApp : Application { 

    [STAThread] 
    public static void Main() { 
     new MyApp().Run(); 
    } 

    protected override void OnStartup(StartupEventArgs e) { 

     new Window().Show(); 

     MenuItem menuItem = new MenuItem(); 
     menuItem.Header = "Exit"; 
     menuItem.Click += delegate { Shutdown(); }; 

     ContextMenu contextMenu = new ContextMenu(); 
     contextMenu.Items.Add(menuItem); 
     contextMenu.IsOpen = true; 
    } 
} 
+0

Siehe SO Antwort: http://stackoverflow.com/questions/606043/shutting-down-a-wpf-application-from-app-xaml-cs – VinayC

+0

Was ist Ihr ShutdownMode eingestellt? – Flot2011

+0

Der ShutdownMode ist der Standard OnLastWindowClose. –

Antwort

2

Dies ist wahrscheinlich ein Fehler in WPF beim Öffnen von ContextMenu. Ich hatte gestern genau das gleiche Problem. Meine Abhilfe ist:

menuItem.Click += delegate { 

    Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Input, 
     (Action)(() => { Shutdown(); })); 

}; 

Aber in meinem Fall öffne ich ContextMenu über Tablett (benachrichtigen) Symbol, damit ich WPF Eltern nicht für sie. In Ihrem Fall würde ich versuchen, ContextMenu Kind des WPF-Fensters zu machen oder zuerst mit der PlacementTarget-Eigenschaft zu spielen.

+0

+1. Bevor ich das Problem isoliert habe, hat mein Code auch ein 'ContextMenu' über eine' NotifyIcon' geöffnet! Ihr Code scheint effektiv zu sein. Danke. Ich weiß nicht, wie ich bestätigen kann, dass es sich um einen Fehler handelt. Daher bin ich mir nicht sicher, ob Ihre Problemumgehung immer funktioniert. Daher zögere ich, Ihre Antwort sofort als akzeptiert zu markieren. –