等待MDI子项关闭,类似于ShowDialog()

时间:2010-06-28 10:31:07

标签: c# modal-dialog mdi

我有一个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。

有人有想法吗?

4 个答案:

答案 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;
        }
    }
}