C# 如何在模式对话框打开时锁定应用程序?

C# 如何在模式对话框打开时锁定应用程序?,c#,.net,wpf,C#,.net,Wpf,我正在使用的应用程序使用模态对话框。我目前正在实现一个会话超时,该超时会在特定的非活动分钟数后自动锁定屏幕,但我遇到了一个问题,即如果用户打开了一个模式对话框,它会显示在会话锁定屏幕的顶部 在WPF.Net应用程序中,识别和强制关闭任何模式对话框(使用取消操作)的一般逻辑是什么?模式对话框有一些复杂之处,最好通过示例加以说明。下面的处理程序在单击时生成一个新的窗口,后面是一个消息框,等待一秒钟,然后关闭这两个窗口。注意,我们希望main窗口保持打开状态 公共部分类主窗口:窗口 { const i

我正在使用的应用程序使用模态对话框。我目前正在实现一个会话超时,该超时会在特定的非活动分钟数后自动锁定屏幕,但我遇到了一个问题,即如果用户打开了一个模式对话框,它会显示在会话锁定屏幕的顶部


在WPF.Net应用程序中,识别和强制关闭任何模式对话框(使用取消操作)的一般逻辑是什么?

模式对话框有一些复杂之处,最好通过示例加以说明。下面的处理程序在单击时生成一个新的
窗口
,后面是一个
消息框
,等待一秒钟,然后关闭这两个窗口。注意,我们希望
main窗口保持打开状态

公共部分类主窗口:窗口
{
const int timeout=1000;
公共主窗口()
{
初始化组件();
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
var win=新窗口{Content=新标签{Content=“非模式窗口”};
使用(新计时器(onTimeRecursed、win、timeout、timeout.Infinite))
{
win.Show();
Show($“打开窗口:{Application.Current.windows.Count}”,“稍等…”);
}
}
私有void OnTimeRecursed(对象状态)
{
Application.Current.Dispatcher.BeginInvoke(
DispatcherPriority.背景,
新操作(()=>
{
((窗口)状态).Close();
}));
}
}
本例的主要优点是非模态窗口和MessageBox都是关闭的。但是,如果我们仔细查看
ontimerecursed
,就会发现只有非模态窗口被告知关闭。鉴于这是调用
MessageBox.Show
时(最后一个)激活的窗口,它也是MessageBox的所有者,因此关闭它也会关闭MessageBox

我们可以替换行
MessageBox.Show(…)使用
新建OpenFileDialog().ShowDialog()并得到类似的结果

这使我们达到了最高水平。如果我们想关闭一个从主窗口实例化的MessageBox,我们如何在不同时关闭这两个窗口的情况下实现呢?一个选项是创建一个虚拟所有者窗口,该窗口从不显示,只是作为调用
Close
的参考

公共部分类主窗口:窗口
{
const int timeout=1000;
私人窗口所有者;
公共主窗口()
{
初始化组件();
初始化emodalowner();
}
私有void InitializeModalOwner()
{
_modalOwner=新窗口
{
AllowTransparency=真,
ShowInTaskbar=false,
WindowStyle=WindowStyle.None,
背景=画笔。透明
};
_modalOwner.Show();
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
使用(新计时器(onTimeRecursed、null、timeout、timeout.Infinite))
{
Show(_modalOwner,$“打开窗口:{Application.Current.windows.Count}”,“稍等…”);
}
}
私有void OnTimeRecursed(对象状态)
{
Application.Current.Dispatcher.BeginInvoke(
DispatcherPriority.背景,
新操作(()=>
{
var mainWindow=Application.Current.mainWindow;
foreach(应用程序中的窗口win.Current.Windows)
如果(赢!=主窗口)
win.Close();
初始化emodalowner();
}));
}
}
在这里,我们迭代当前
WindowCollection
中的所有窗口,并关闭它们,只要它们不是应用程序的主窗口。在此之后,
\u modalOwner
也将被关闭,使其变得无用——一旦关闭了
窗口
实例,您就不能在其上调用
Show
。所以这也是再次初始化它的地方

这同样适用于
newOpenFileDialog().ShowDialog(_modalOwner)。调用
ShowDialog
的任何
窗口
实例将自动添加到
应用程序.Current.Windows
集合中

资源

如果关闭模式没有问题,我建议使用模式中的cron作业来检查父级的某些变量,以确定会话是否已锁定,那么您只需在模式中调用close方法即可。如果没有,您可以检查您的模式变量,并从另一个线程调用close。@nalnpir我考虑过这一点,但是应用程序中有很多地方显示模式对话框。有些是通用的,如OpenFileDialog或MessageBox,而另一些则更复杂,如自定义对话框。检查一下Jogy的答案,也许这正是你想要的for@nalnpir谢谢,这是一个很好的方向看!谢谢我正在尝试为模式对话框所有者设置隐藏窗口的第二种解决方案,但在尝试关闭窗口时遇到异常-
无法设置可见性或调用Show、ShowDialog或WindowInteropHelper。请确保在窗口关闭后进行处理。我不完全确定是什么试图设置可见性,除非它可能与装饰窗有关……是的,就是这样。我必须添加一个复选框,以便
&&(win.GetType().FullName!=“Microsoft.VisualStudio.DesignTools.WpfTap.WpfVisualTreeService.Adorners.AdornerLayerWindow”
。不过,您的概念证明似乎不错。现在看看如何将其应用到我正在开发的应用程序中。我只想关闭模式对话框,而不是所有窗口。谢谢!