3 формы Show и ShowDialog не работают должным образом, ошибка? - PullRequest
1 голос
/ 18 сентября 2010

Я использую Visual Studio 2010, C # .NET 4.0. У меня есть 3 формы: Form1, Form2, Form3.

В Form1 у меня есть кнопка, чтобы открыть Form2:

private void button1_Click(object sender, EventArgs e)
{
    Form2 f = new Form2();
    f.Show();
}

В Form2 у меня есть личная переменная Form3, всегда указывающая на одну и ту же форму Form3:

private Form3 f = new Form3();

И кнопка, чтобы открыть его в виде диалога:

private void button1_Click(object sender, EventArgs e)
{
    f.ShowDialog();
}

В Form3 у меня просто есть кнопка, чтобы скрыть форму:

private void button1_Click(object sender, EventArgs e)
{
    this.Hide();
}

Проблема заключается в том, что в ситуации, когда Form2 находится перед Form1, а Form3 перед Form2, когда я нажимаю кнопку Form3, чтобы скрыть ее, она не только скрывается, но и отправляет Form1 позади всех другая Windows.

Это происходит только тогда, когда на заднем плане формы Form1 находится окно другой программы (например, Windows Explorer). Это похоже на ошибку. Что ты думаешь?

Ответы [ 2 ]

5 голосов
/ 18 сентября 2010

Да, это не может работать должным образом. Диалог отключает все окна, которые отображает ваша программа. Так что это модально. Когда вы скрываете диалоговое окно, не остается окон, которые могли бы получить фокус. Windows вынуждена найти другое окно, на которое нужно обратить внимание. Это будет окно, принадлежащее другому приложению. Ваши собственные окна теперь будут прятаться за ним.

Побочных эффектов больше, диалог также закроется. Это необходимо, потому что в противном случае пользователь больше не сможет вернуться к вашей программе, поскольку все окна отключены. Это все неудивительное поведение. Ошибка была бы сильным словом, но она, конечно, работала бы лучше, если бы сначала включила все окна перед закрытием диалога. Но закрытие диалога - это уже нежелательное поведение.

Не вызывайте Hide () для диалога. Просто установите для свойства DialogResult значение DialogResult.Cancel, чтобы получить точно такой же эффект за вычетом проблемы с фокусом. Вам нужно сбросить его обратно на None, если вы хотите снова отобразить диалоговое окно. Это настоящая ошибка.

1 голос
/ 18 сентября 2010

По документации. Form.Close метод не располагает формами, показанными Form.ShowDialog .Цитата:

Два условия, когда форма не расположена при закрытии, это когда (1) она является частью приложения с интерфейсом с несколькими документами (MDI), а форма не отображается;и (2) вы отобразили форму, используя ShowDialog.В этих случаях вам нужно будет вызвать Dispose вручную, чтобы пометить все элементы управления формы для сбора мусора.

Итак, возможно, есть способы вернуть фокус в ваше приложение (например, через Windows API).Но гораздо удобнее вызывать Form.Close вручную в диалоговых окнах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...