2012-04-06 4 views
1

Эта программа WPF отображает ContextMenu, на котором размещается MenuItem с надписью «Выход» вместе с пустым окном. Выбор «Выход» должен завершать процесс, но он закрывает только Window и ContextMenu. Я не хочу принудительно прекращать эту программу, но заканчиваю ее чисто.Application.Shutdown() не выполняется из ContextMenu

Почему вызов Application.Shutdown() в обработчике событий Click не позволяет завершить работу программы?

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

См. Этот ответ SO: http://stackoverflow.com/questions/606043/shutting-down-a-wpf-application-from-app-xaml-cs – VinayC

+0

В чем ваш ShutdownMode установлен? – Flot2011

+0

Значение ShutdownMode по умолчанию - OnLastWindowClose. –

ответ

2

Это, вероятно, ошибка в WPF при открытии ContextMenu. Вчера у меня была такая же проблема. Мой обходной путь является:

menuItem.Click += delegate { 

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

}; 

Но в моем случае я открываю ContextMenu над подносом (уведомить) значок, чтобы я не WPF родителя для него. В вашем случае я попытался бы сделать окно ContextMenu окна WPF или сначала сыграть с свойством PlacementTarget.

+0

+1. На самом деле, прежде чем я выделил проблему, мой код также открыл «ContextMenu» над «NotifyIcon»! Ваш код кажется эффективным; Спасибо. Я не знаю, как подтвердить, что это ошибка, поэтому я не уверен, что ваше обходное решение всегда будет работать, что оставляет мне немного нерешительность, чтобы сразу отметить ваш ответ. –

Смежные вопросы