我有一个模态对话框显示主应用程序窗口设置为所有者(如dialog.ShowDialog(mainAppWindow)
),我想暂时允许用户与主应用程序窗口交互,然后再次返回到模式对话框。
我怎样才能做到这一点?我正在使用Windows窗体。
编辑:AutoCAD做得很好。
只需关闭模态对话框即可。它不会像普通的Form实例一样处理,所以你只需将其DialogResult属性设置回None并再次调用ShowDialog()即可将其恢复为活动状态。
请注意,在模式对话框上调用Hide()也会关闭它,因为所有应用程序的窗口都被禁用。与Close()没什么区别。
然后我不认为你想要一个模态对话...
模态对话框的全部目的是用户在以某种方式摆脱它之前不能做任何事情。我认为你应该创建自己的表单类,以你想要的方式行事。
看看http://en.wikipedia.org/wiki/Modal_window#Criticisms ......有一种想法,你不应该首先使用模态窗口。
您需要再次启用父窗口。对于模态对话框,Windows会自动禁用父窗口,并在模式对话框关闭时重新启用它。
我没试过,但将父表单的Enabled属性设置为true就足够了。如果使用EnableWindow Win32 API无法正常工作。
出于某种原因,我必须在.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
}
它可能不是干净的解决方案(因为不需要隐藏模态对话框),但它至少适用于我的情况。
模态/无模式范例是,如果您希望用户能够与主应用程序交互,请使用无模式窗口,如果不希望,请使用模态。如果你想阻止他使用主应用程序 - 但随后使用它 - 但不使用它 - 你的用户界面设计不适用于模态/无模式范例。