2010-06-28 53 views
1

我有一个MDI-应用程序,我想使用模态对话框...是的,我知道这是有点违背原则,如果MDI ......无论如何,我的主窗口更像是一个“工作区”,然后是其他任何东西。等待MDI子关闭,类似于ShowDialog()

返回主题,我该如何等待MDI-Child关闭?一些示例代码:

public void DoSomething() { 
    String searchterm = this.TextBox1.Text; 
    MyItem result = MySearchForm.GetItem(searchterm); 

    if(MyItem != MyItem.Empty) { 
     // do something 
    } 
    } 

MySearchForm是主窗口的MDI-孩子,所以我不能使用的ShowDialog(),但我还是喜欢用一个阻塞方法等待窗口关闭并返回结果。我想在另一个线程上调用它并等待那个线程退出,但这也不适用于MDI。

有人有想法吗?

回答

2

MDI应用程序中使用的对话框是很正常的,这并不违反MDI约定。只是不要让它成为一个MDI子窗口。这很糟糕,因为你不能使它成为模态。如果你把它变成非模态,那么当用户最小化窗口时会发生混淆。

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

+0

+1。我同意标准模态形式是最好的选择。想出来的负载我想你可能会有一种古怪的非模态形式,你突然想成为模态,但这将是非常奇怪的。 – PaulG 2010-06-28 13:59:33

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