我有一个MDI-Application,我想使用模态对话框......是的,我知道这有点违反原则,如果MDI ......无论如何,我的主窗口更像是一个“工作区”然后其他任何事情。
回到主题,我该如何等待MDI-Child关闭?一些示例代码:
public void DoSomething() {
String searchterm = this.TextBox1.Text;
MyItem result = MySearchForm.GetItem(searchterm);
if(MyItem != MyItem.Empty) {
// do something
}
}
MySearchForm是主窗口的MDI-Child,所以我不能使用ShowDialog(),但我仍然想使用阻塞方法等待窗口关闭并返回结果。我想在另一个线程上调用它并等待那个线程退出,但这也不适用于MDI。
有人有想法吗?
答案 0 :(得分:2)
尝试禁用主窗体,然后在子窗体关闭时重新启用它。它有点像这样:
public void DoSomething()
{
searchForm.Show();
searchForm.SearchTerm = this.TextBox1.Text;
searchForm.FormClosing += new FormClosingEventHandler(searchForm_FormClosing);
this.Enabled = false
}
void searchForm_FormClosing(object sender, FormClosingEventArgs e)
{
this.Enabled = true;
// Get result from search form here
MyItem result = searchForm.GetItem();
if(MyItem != MyItem.Empty) // do something
}
答案 1 :(得分:2)
在MDI应用程序中使用对话框是很正常的,它不违反MDI约定。只是不要把它变成MDI子窗口。这很糟糕,因为你不能让它模态化。如果你使它成为非模态的,那么当用户最小化窗口时会发生混乱的事情。
只需使用ShowDialog(所有者)或Show(所有者)方法(分别为模态和非模态),并将MDI父级作为所有者传递。该对话框将始终位于子窗口之上。您通常需要StartPosition = Manual并设置Location,以确保它在父框架内的适当位置启动。
答案 2 :(得分:0)
如果失去它,只需将焦点移回MDI孩子。将LostFocus事件挂钩在MDI子窗口中并使用 this.SetFocus();
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.enter.aspx
答案 3 :(得分:0)
重载主窗口的FormClosing事件:
void MyForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
// User clicked the close button.
// Cancel if dialogs are open.
if (dialogsOpen)
{
e.Cancel = true;
}
}
}