Button.Visible = true; не удается установить кнопку видимой при активации в функции - PullRequest
3 голосов
/ 25 февраля 2012

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

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

Вот код:

private void trackbar_Change(object sender, EventArgs e)
{
    button.Visible = true;
    progressbar.Visible = true;

    ...

    progressbar.Visible = false;
    button.Visible = false;
}

Индикатор выполнения отображается и работает нормально, и весь другой код в функции также работает нормально, но кнопка вообще не отображается.

Если я удаляю button.Visible = false; из конца функции, то кнопка ДОКАЗЫВАЕТСЯ, но только после того, как весь другой код был выполнен. Как это:

private void trackbar_Change(object sender, EventArgs e)
{
    button.Visible = true;
    progressbar.Visible = true;

    ...

    progressbar.Visible = false;
    //button.Visible = false;
}

Комментирование этой строки приводит к появлению кнопки. Теперь, если я добавлю окно сообщения после строки кнопки, то это также работает.

private void trackbar_Change(object sender, EventArgs e)
{
    button.Visible = true;
    MessageBox.Show("Button should be visible now");
    progressbar.Visible = true;

    ...

    progressbar.Visible = false;
    button.Visible = false;
}

Добавление окна сообщения после строки кнопки привело к тому, что кнопка появилась в нужное время.

У кого-нибудь есть идеи, почему эта кнопка ведет себя так?

Ответы [ 3 ]

8 голосов
/ 25 февраля 2012

Похоже, что поток GUI занят.Попробуйте принудительно обновить экран, вызвав Application.DoEvents () , например:

button.Visible = true;
progressbar.Visible = true;
Application.DoEvents();

DoEvents() заставит обрабатывать все сообщения в очереди сообщений.

A лучшим решением было бы перемещение длинного потока основного потока пользовательского интерфейса.Используйте BackgroundWorker для этой задачи.

Это сделает форму более гибкой в ​​целом.Например, вы сможете взаимодействовать с формой, и она не станет белой.Реализация BackgroundWorker проста и необходима для длительных процессов в основном потоке пользовательского интерфейса,

1 голос
/ 25 февраля 2012

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

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

Есть еще один способ - но, вероятно, менее корректный - это выпустить обновление в форме после установки видимого в true.

Дайте мне знать, если вам нужна помощь с BackgroundWorker, но это довольно просто.

0 голосов
/ 25 февраля 2012

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

Если вы вызываете DoEvents в своем коде, ваше приложение может обрабатывать другие события. Используйте Application.DoEvents();

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