2010-06-28 7 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 (owner) (соответственно модальный и немодальный) и передайте родительский MDI в качестве владельца. Диалог всегда будет поверх дочерних окон. Обычно вам нужно StartPosition = Manual и установить Location, чтобы вы могли убедиться, что он запускается в соответствующей позиции в родительском фрейме.

+0

+1. Я согласен с тем, что стандартные модальные формы - лучший вариант. Размышляя о загрузке, я предполагаю, что у вас может быть изворотливая немодальная форма, которую вы вдруг захотите быть модальной, но это было бы очень странно. – PaulG

0

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

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

+0

Хорошая идея ... но это не дает мне блокирующей функции, которую я мог бы использовать. – Bobby

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 
    } 
Смежные вопросы