Как я могу остановить form.showdialog от блокировки формы бабушки и дедушки в DotNet? - PullRequest
3 голосов
/ 06 июля 2011

Итак, у меня есть форма меню для моего приложения, давайте назовем его прародителем.Пользователь нажимает кнопку, и она вызывает другую форму, назовем ее родительской формой с помощью form.show ().Поскольку я использовал show (), а не showdialog (), я теперь могу поиграть с любой формой.

Затем в родительской форме я вызываю третью форму, назовем ее дочерней, с помощью form.showdialog ().Я хочу, чтобы пользователь закрыл дочернюю форму, прежде чем что-либо делать с родительской формой, и это именно то, что происходит.Проблема в том, что теперь я не могу использовать форму деда, она заблокирована, пока я не закрою дочернюю форму, и я не хочу, чтобы она была.

Другими словами, я хочу, чтобы дочерняя форма была модальной, но только в отношении родительской формы, а не в форме прародителя.Можно ли это сделать?

Ответы [ 2 ]

3 голосов
/ 06 июля 2011

если вы можете согласиться с тем фактом, что ваши родительские и дочерние формы живут в другом потоке, чем ваш прародитель (поэтому вам придется вызывать, когда вам нужно использовать элементы управления в другом потоке), вы можете запустить второй поток пользовательского интерфейса для своего потока.родительская форма ...

, когда модальное диалоговое окно блокирует очередь сообщений потока пользовательского интерфейса родительских форм, поток пользовательского интерфейса дедушки и бабушки по-прежнему будет иметь свою собственную неблокированную очередь сообщений ...

, поэтомувместо того, чтобы звонить

new ParentForm().Show();

где-нибудь в коде вызова вашей бабушки и дедушки

new System.Threading.Thread(
                    delegate() {
                        Application.Run(new ParentForm());
                    }
                ).Start();
0 голосов
/ 06 июля 2011

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

Вы можете отключить родительскую форму вручную (отключить все элементы управления - поместить все в UserControl или Panel и просто отключить это). Тогда вы можете просто выбросить сообщение, если пользователь нажмет на родительскую форму со словами «пожалуйста, закройте сначала». Когда дочерняя форма закрывается, снова включите родительский.

Если вы хотите, чтобы дочерняя форма оставалась видимой, установите свойство TopMost, но будьте осторожны, так как это действительно может раздражать пользователя.

...