2

我有一个 MDI 应用程序,我想在其中使用模式对话框...是的,我知道这有点违反 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

4 回答 4

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
  }
于 2010-06-28T12:06:33.003 回答
2

在 MDI 应用程序中使用对话框是很正常的,它不违反 MDI 约定。只是不要让它成为 MDI 子窗口。这很糟糕,因为你不能让它成为模态的。如果你让它成为非模态的,那么当用户最小化窗口时就会发生令人困惑的事情。

只需使用 ShowDialog(owner) 或 Show(owner) 方法(分别为模态和非模态)并将 MDI 父级作为所有者传递。该对话框将始终位于子窗口的顶部。您通常确实需要 StartPosition = Manual 并设置 Location 以便您可以确保它在父框架内的适当位置启动。

于 2010-06-28T13:31:37.347 回答
0

如果失去焦点,只需将焦点移回 MDI 子项。在 MDI 子窗口中挂钩 LostFocus 事件并使用this.SetFocus();

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.enter.aspx

于 2010-06-28T10:34:50.087 回答
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;
        }
    }
}
于 2010-06-28T11:49:21.673 回答