我显示了一个模式对话框,主应用程序窗口设置为所有者(如 中dialog.ShowDialog(mainAppWindow)
),我想暂时允许用户在再次返回模式对话框之前与主应用程序窗口进行交互。
我怎样才能做到这一点?我正在使用 Windows 窗体。
编辑: AutoCAD 做得很好。
我显示了一个模式对话框,主应用程序窗口设置为所有者(如 中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
}
它可能不是干净的解决方案(因为不需要隐藏模式对话框),但它至少适用于我的情况。