关闭所有打开的模态对话框窗口

时间:2011-02-23 16:39:14

标签: wpf wpf-controls

我有一个WPF应用程序,它有几个用于各种目的的模态窗口。使用ShowDialog函数可以轻松完成此操作。但是,在我的应用程序中,我有一个计时器来测量将导致用户注销的空闲时间(即没有鼠标移动或击键)。有没有办法(当这个计时器触发时)查找并关闭所有打开的模态窗口而不显式跟踪每个窗口?

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

谢谢, 马特

2 个答案:

答案 0 :(得分:4)

  

是否有办法(当此计时器触发时)查找并关闭所有打开的模态窗口而不显式跟踪每个窗口?

您可以使用ComponentDispatcher.IsThreadModal检查您的UI线程是否处于模态状态。如果是,Application.Current.Windows属性将为您提供已打开的Windows列表。

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

不幸的是,没有直接的API来确定特定的Window是否是模态的 - 但是可以使用Window类中的私有变量来执行此操作。例如,以下方法使用反射来确定Window是否为模态:

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

遗憾的是,这可能会发生变化(因为它使用的是未记录的私人成员)。

答案 1 :(得分:3)

您是否尝试过迭代Application.Current.Windows集合,并关闭所有不属于Application.Current.MainWindow的文件?

Jogy

相关问题