Ожидание закрытия дочернего элемента MDI, аналогичного ShowDialog () - PullRequest
1 голос
/ 28 июня 2010

У меня есть 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-дочерним элементом главного окна, поэтому я не могу использовать ShowDialog (), но я все же хотел бы использовать метод блокировки для ожидания окназакрыть и вернуть результат.Я думал о том, чтобы вызвать его в другом потоке и дождаться его завершения, но это также не работает с MDI.

У кого-нибудь есть идея?

Ответы [ 4 ]

2 голосов
/ 28 июня 2010

Использование диалогов в приложении MDI вполне нормально, оно не нарушает соглашения MDI.Только не делайте это дочерним окном MDI.Это плохо, потому что вы не можете сделать это модальным.И если вы сделаете его немодальным, тогда произойдет запутывание, когда пользователь свернет окно.

Просто используйте метод ShowDialog (owner) или Show (owner) (соответственно модальный и немодальный) и передайте MDIродитель в качестве владельца.Диалог всегда будет поверх дочерних окон.Обычно вы хотите, чтобы StartPosition = Manual и установить Location, чтобы вы могли быть уверены, что он запускается в соответствующей позиции в родительском фрейме.

2 голосов
/ 28 июня 2010

Попробуйте отключить основную форму, затем снова включите ее, когда дочерняя форма закрывается.Это было бы примерно так:

  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
  }
0 голосов
/ 28 июня 2010

Перегрузить событие 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;
        }
    }
}
0 голосов
/ 28 июня 2010

Просто переместите фокус обратно на MDI-ребенка, если он его потеряет. Подцепите событие LostFocus в дочернем окне MDI и используйте this.SetFocus ();

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

...