Принудительная перерисовка перед продолжительными операциями - PullRequest
7 голосов
/ 15 ноября 2011

Когда у вас есть кнопка и вы делаете что-то вроде:

Private Function Button_OnClick

    Button.Enabled = False

    [LONG OPERATION] 

End Function

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

Так как заставить кнопку перерисовать в отключенном состоянии? Я пытался .UpdateLayout () на кнопке, но это не имело никаких эффектов. Я также попробовал System.Windows.Forms.DoEvents (), которая обычно работает при использовании WinForms, но также не имела никакого эффекта.

Ответы [ 3 ]

8 голосов
/ 15 ноября 2011

Следующий код сделает то, что вы ищете.Однако я бы не стал этим пользоваться.Используйте класс BackgroundWorker для длительных операций.Он прост в использовании и очень стабилен.
Здесь код:

   public static void ProcessUITasks() {            
        DispatcherFrame frame = new DispatcherFrame();
        Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(delegate(object parameter) {
            frame.Continue = false;
            return null;
        }), null);
        Dispatcher.PushFrame(frame);
    }

Здесь вы найдете пример использования BackgroundWorker.

0 голосов
/ 10 июня 2017

В Windows.Forms вы можете Button.Refresh().

В Windows.Forms или WPF вы можете уступить насосу сообщений, чтобы он мог перерисоваться.Async / Await были разработаны, чтобы позволить вам сделать это без мерзости ответа HCL.

Private Async Function Button_OnClick

    Button.Enabled = False

    Await Task.Yield

    [LONG OPERATION] 

End Function
0 голосов
/ 15 ноября 2011

InvalidateVisual (); @HCL правильно ... не делайте этого

Как вы говорите, лучше начать использовать фоновый поток / диспетчер и держать поток пользовательского интерфейса разблокированным. Рассмотрите библиотеку Reactive Extensions от Microsoft для высокоуровневого асинхронного программирования пользовательского интерфейса

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