Как я могу показать модальное диалоговое окно без блокировки? - PullRequest
0 голосов
/ 21 октября 2019

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

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

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

Я получил эту идею, прочитав этот ответ здесь: https://stackoverflow.com/a/5183623/259846

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

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

И да, у меня может быть только один поток, без параллелизма,

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Отключите все остальные элементы вручную при открытии DialogBox. Затем включите их при закрытии окна.

, например: Button.Enabled = false;

Проверьте это для отключения всех элементов управления Как отключить все элементы управления в форме, кроме кнопки?

Вы также можете поставить прозрачный прямоугольник перед всем, что вы не можете щелкнуть. Затем скрыть, когда диалоговое окно закрывается.

0 голосов
/ 21 октября 2019

Я думал об одном способе сделать это. Мой вопрос, вероятно, не совсем ясно указывает на мой вариант использования. Это решение по-прежнему использует блокирующий вызов для создания модального диалога, но все же позволяет мне выполнить цикл «делай работу, обновляй прогресс» с открытым диалогом.

var progress = new Form();
this.BeginInvoke(new Action(() =>
{
    for (int i = 0; i < 100; i++)
    {
        System.Threading.Thread.Sleep(16); // do a bit of my process
        // Update progress dialog
        Application.DoEvents();
    }
    progress.Close();
}));
progress.ShowDialog();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...