2015-06-03 169 views
0

在用户关闭其中一个窗口之后,有什么办法可以关闭所有窗口吗?下面是重要的部分:不使用App.Current.Shutdown(),而是在其余窗口上单独调用close在关闭一个窗口之后关闭WPF中的所有窗口

我的想法是在Window_Closing事件处理程序方法的每个其余窗口中调用close。但有一个问题。假设我有两个窗口类,AB。我分别创建了AB - ab的一个实例。如果我关闭窗口A,则它会调用Window_closing事件处理程序方法,并在那里调用b.close()。然后在B类(AB是窗口类,它们都来自Window继承)Window_closing方法被调用(因为我刚刚叫B.close())和B::Window_closing电话a.close()并且它导致异常的原因,我已经关闭a

什么是解决这个正确的方法是什么?

+0

不会退出整个应用程序? – spark

+0

为什么你想避免'App.Current.Shutdown()'?如果有一个你没有描述的要求,那么你可能还有一个你没有想到的替代解决方案。 –

回答

0

处理Window.Closed事件而不是Window.Closing这将关闭除MainWindow以外的所有打开的窗口。我不打电话给Close方法MainWindow,因为这是导致应用程序终止的主线程。

private void Window_Closed(object sender, EventArgs e) 
{ 
    var windows = Application.Current.Windows; 
    foreach (var item in windows) 
    { 
     if ((item as Window).Title.ToLower() == "mainwindow") continue; 
     (item as Window).Close(); 
    } 
} 
+0

不起作用。我将它复制到A类和B类'Window_closing'方法中,并且程序不会退出。 – user4968912

+0

请删除将关闭应用程序的代码段中的if条件,也请将您的代码移至Window.Closed事件而不是WIndow.Closing –

2

如果你有兴趣在具有“主窗口”和“工具窗口”,使关闭主窗口关闭所有的人都和关闭工具窗口呢,好了,只有这一点 - 然后在App.xaml有一个友好的选择只是为了!

这是Application.ShutdownMode

<Application 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

    StartupUri="MainWindow.xaml" 
    ShutdownMode="OnMainWindowClose" 
    > 
</Application> 

注意的是,这里的“主窗口”中的问题,是主窗口应用程序开头(或者你设置为主要的一个,如果你在与发挥应用程序的一生)。

编辑:afterthought:这当然会关闭所有的窗口,但我不确定它是否调用正常的“关闭”,或者只是关闭整个应用程序。对不起,你需要自己检查一下。如果您对我的观点感兴趣,那么您应该/可以轻松做到这一点,如果您确实需要通过“关闭”每个窗口来关闭应用程序,那么我感觉您正在做某件事这里错了,好像我没有记错,“Window.Close()”可能会被取消。

EDIT2:yup,Window.Close()可以取消。请see this article

关闭窗口会导致抛出了Closing事件。如果不取消Closing 事件,会出现以下情况:(...)

所以遍历窗口收集,并呼吁“关闭”并没有真正保证窗户真的会被关闭,应用程序可能仍然会继续运行。

0

事情是这样的:

private static bool WindowsClosing; 
public static void CloseAllWindows() 
{ 
    if(WindowsClosing) return; 
    WindowsClosing = true; 
    var windows = Application.Current.Windows; 
    foreach (var wnd in windows.OfType<Window>()) 
    { 
    wnd.Close(); 
    } 
} 

再叫您Window_Closing该方法(或相当Window_Closed如果你不需要取消)事件