Вам нужно немодальное диалоговое окно.См. как отображать модальные и немодальные диалоговые окна
Модальное диалоговое окно
Модальное диалоговое окно - это диалоговое окно, которое принимает весь пользовательский ввод приложения.Пока это диалоговое окно открыто, другие формы приложения не будут реагировать на ввод пользователя.Это наиболее используемая форма диалоговых окон.Пример: диалоговое окно сохранения файла .Пока это диалоговое окно открыто, вы не можете редактировать документ.Сначала вам нужно закрыть диалоговое окно, прежде чем вы сможете продолжить изменение документа.Вы можете увидеть это в Блокнот при сохранении файла.Пока открыто диалоговое окно сохранения файла, вы ничего не можете сделать с главной формой
Модальное диалоговое окно обычно отображается следующим образом:
private void onButton1_Clicked(object sender, ...)
{
using(var dlg = new MyModalDialog())
{
dlg.PropertyA = ...; // set some properties of the dialog
dlg.PropertyB = ...;
var dlgResult = dlg.ShowDialog(this); // show the dialog. I am the parent
// this procedure is blocked until the dialog is closed.
// if here: result is available:
switch (dlgResult)
{
case DialogResult.OK:
ProcessResult(dlg.GetResult());
break;
case DialogResult.Cancel:
ProcessCancel();
break;
default:
...
}
}
}
Немодальное диалоговое окно
Вы хотите немодальное диалоговое окно: после показа одной формы вы хотите продолжить в своем коде, чтобы иметь возможность показать другую форму.Для этого вы не используете Form.ShowDialog , но Form.Show
private MyForm1 formA = null;
private MyForm2 formB = null;
private void onButton1_Clicked(object sender, ...)
{
this.formA = new MyForm1())
this.formA.PropertyA = ...;
this.formB = new MyForm2())
this.formB.PropertyA = ...;
// make sure the forms are shown side by side
this.formA.Position = ...
this.formA.Size = ...
this.formB.Position = ...
this.formB.Size = ...
// show the forms:
this.formA.Show(this);
this.formB.Show(this);
// while the form are shown, your main form can continue
...
}
Вам придется подписаться на Form.Closed событие, прежде чем показывать формы, чтобы вы могли выполнять действия, такие как Утилизация форм.
this.FormA.Closing += new System.EventHandler(this.OnSubFormClosed);
this.FormA.Show(this);
В OnSubFormClosed
вы должны проверить «Отправителя», чтобы проверить, какая форма закрыта, и действовать соответственно:
void OnSunFormClosed(object sender, EventArgs e)
{
if (Object.ReferenceEquals(sender, this.formA)
{ // FormA closed:
this.ProcessFormAClosed();
this.FormA.Dispose();
this.FormA = null;
}
else if (Object.ReferenceEquals(sender, this.FormB)
{
...
}
}
Наконец: вы должны сообщить свои формы, когда ваша основная форма закрывается.Если вы сделаете это в Form.OnClosing вместо Form.OnClosed , вы можете спросить свои формы, согласны ли они с тем, что они закрыты.Например, форма может попросить оператора сохранить файл и дать возможность ответить да / нет / отменить.В последнем случае приложение не должно быть закрыто.Проверьте это поведение, если вы пытаетесь закрыть Блокнот с несохраненными изменениями.
protected override void OnFormClosing(cancelEventArgs e)
{
// the following may be optimized
bool closeFormAallowed = this.formA?.IsClosingAllowed ?? true;
bool closeFormBallowed = this.formB?.IsClosingAllowed ?? true;
// cancel closing if closing is not allowed
e.Cancel = !closeFormAallowed || !closeFormBallowed;
// don't forget to raise the event so my subscribers my decide to cancel closing:
if (!e.cancel) base.OnClosing(e);
// if no one wants to cancel closing: close the forms:
if (!e.Cancel)
{
if (this.formA != null) this.formA.Close();
it (this.formB != null) this.formB.Close();
// this will raise the events, so the forms are properly disposed
}
}