2011-02-23 94 views
2

我有一个WPF应用程序,有几个模态窗口用于各种目的。这很容易通过使用ShowDialog函数来完成。但是,在我的应用程序中,我有一个计时器来测量将导致用户注销的空闲时间(即没有鼠标移动或按键敲击)。有没有办法(当这个计时器触发)找到并关闭所有打开的模态窗口而不明确地跟踪每一个?关闭所有打开的模式对话窗口

更新 我还想关闭任何MessageBox.Show实例。这可能吗?

谢谢, 马特

回答

4

有没有一种方法(当此计时器火灾)找到并关闭所有打开的模态窗口没有明确地跟踪每个?

您可以使用ComponentDispatcher.IsThreadModal来检查您的UI线程是否处于模态状态。如果是,Application.Current.Windows属性会给你打开的Windows列表。

如果您只有一个MainWindow,您可以关闭其他任何人(因为他们是您的模态对话框),但是如果您有多个窗口,则必须检查每个窗口。

不幸的是,没有直接的API来确定某个特定的窗口是否是模态的 - 但是在Window类中有一个私有变量可用于执行此操作。例如,下面的方法使用反射来确定窗口是否是模式:

public static bool IsModal(Window window) 
    { 
     Type type = typeof(Window); 
     var field = type.GetField("_showingAsDialog", BindingFlags.Instance | BindingFlags.NonPublic); 
     return field.GetValue(window); 
    } 

这是不幸的是,如有变更(因为它使用未记录的私有成员)。

+0

感谢您的回答。我不知道Application.Current.Windows属性。另外,我欣赏关于_showingAsDialog字段的信息。这看起来像票。我更新了我的问题以包含MessageBox实例。你知道如何以类似的方式关闭这些吗? – 2011-02-23 17:14:31

+0

@Matt:不幸的是,MessageBox.Show可能需要P/Invoke调用,因为它们没有可以访问的窗口...如果你也必须处理这个,你可能想要要么在这里重新考虑你的设计,要么用EnumWindows和类似的方法来调用PInvoke来跟踪所有打开的窗口... – 2011-02-23 17:16:58

+0

谢谢。我想我们会尝试将所有的MessageBox调用转换为窗口,这些窗口在与您的答案结合时应该可以解决这个问题。 – 2011-02-23 19:44:54

3

您是否尝试过迭代Application.Current.Windows收集,并关闭所有这些不属于Application.Current.MainWindow?

Jogy

+0

我只是根据我在MSDN论坛上发现的一个线索做了这个,http://social.msdn.microsoft.com/Forums/en/wpf/thread/86e4806f-8f95-49a8-811e-e01514518e16 – 2011-02-23 17:02:43

+0

我更新了我的问题包括MessageBoxes。你知道如何以类似的方式关闭这些吗? – 2011-02-23 17:15:32