我有一个模态对话框,主应用程序窗口设置为所有者(如dialog.ShowDialog(mainAppWindow)
),我想暂时允许用户与主应用程序窗口交互,然后再次返回模态对话框。
我该怎么做?我使用的是Windows Forms。
编辑:AutoCAD做得很好。
答案 0 :(得分:15)
然后我认为你不想要一个模态对话......
模态对话框的全部目的是用户在以某种方式摆脱它之前不能任何。我认为您应该创建自己的表单类,以按照您希望的方式运行。
答案 1 :(得分:3)
关闭模态对话框。它不会像普通的Form实例一样被处理掉,只需将其DialogResult属性设置为None并再次调用ShowDialog()即可将其恢复为活动状态。
请注意,在模式对话框上调用Hide()也会关闭它,因为所有应用程序的窗口都被禁用。与Close()无异。
答案 2 :(得分:2)
看看http://en.wikipedia.org/wiki/Modal_window#Criticisms ......有一种想法,你不应该首先使用模态窗口。
答案 3 :(得分:1)
您需要再次启用父窗口。对于模态对话框,Windows会自动禁用父窗口,并在模式对话框关闭时重新启用它。
我还没试过,但将父表单的Enabled属性设置为true就足够了。如果使用EnableWindow Win32 API无法正常工作。
答案 4 :(得分:0)
模态/无模式范例是,如果您希望用户能够与主应用程序交互,请使用无模式窗口,如果不希望,请使用模态。如果你想阻止他使用主应用程序 - 但随后使用它 - 但不使用它 - 你的用户界面设计不适用于模态/无模式范例。
答案 5 :(得分:0)
出于某种原因,我必须在.NET中遇到同样的问题。 我有(主)表单显示模态对话框,我需要隐藏,与主窗口交互,然后再次返回模态对话框。
我个人不了解Windows(API)观点的后果,但以下解决方案适用于我。
整个技巧在于在显示模态对话框之前将主窗体设置为禁用(当主窗体未显式设置为Enabled = false时,隐藏模态对话框后,即使调用Enabled = true,也无法与其进行交互)。
作为对模态对话框事件(称为NeedInteraction)的响应,我只是隐藏模态对话框,启用主窗体,在某个循环中与用户进行交互,禁用主对话框并再次显示模态对话框。
void ShowDialog()
{
var dialog = new MyModalForm();
dialog.NeedInteraction += (sender, eventArgs) =>
{
dialog.Hide();
Enabled = true;
//wait till user finishes working with main window
Enabled = false;
dialog.Show();
}
Enabled = false;
dialog.ShowDialog();
Enabled = true; //don't forget to make it enabled afterwards
}
它可能不是干净的解决方案(因为不需要隐藏模态对话框),但它至少适用于我的情况。