我有一个WPF应用程序,它有几个用于各种目的的模态窗口。使用ShowDialog
函数可以轻松完成此操作。但是,在我的应用程序中,我有一个计时器来测量将导致用户注销的空闲时间(即没有鼠标移动或击键)。有没有办法(当这个计时器触发时)查找并关闭所有打开的模态窗口而不显式跟踪每个窗口?
更新 我还想关闭任何MessageBox.Show实例。这可能吗?
谢谢, 马特
答案 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