2015-06-23 1 views
2

Я пытаюсь изменить текст, нарисованный на кнопке в начале обработчика события клика. Независимо от того, что я делаю, текст не изменяется до тех пор, пока метод обработчика событий не завершится. Я попытался вызвать обновление, обновление и недействительность методов, а также попытался вызвать Application.DoEvents после этого.В VB.NET, как мне получить текст кнопки для изменения в своем собственном обработчике событий?

Единственное, что работает, которое я не хочу делать, это настроить таймер так, чтобы завершился обработчик события клика, текст кнопки обновился, затем таймер помечает и ТОГДА я делаю все остальное, что хотел делать в обработчике кликов в обработчике таймера, а не ...

+2

это как Windows работает. Он не может приостановить обработку клика даже для обработки краски, даже если вы вызвали, а затем вернуться туда, где она была остановлена ​​в событии клика. – Plutonix

+0

Если вы публикуете то, что вы пробовали и описываете свою конечную цель, кто-то может предложить альтернативное решение, соответствующее вашим потребностям. –

+0

Попробуйте btw.Refresh() внутри обработчика события. – Ender2050

ответ

3

Проблема в том, что ваш пользовательский интерфейс «зависает», пока ваша длинная операция выполняется в потоке пользовательского интерфейса. Вы могли бы решить эту проблему, запустив длительную работу в фоновом потоке, например, с помощью BackgroundWorker в вашей кнопки обработчик события:

Dim bw As New BackgroundWorker() 

AddHandler bw.DoWork, 
    Sub(sender, args) 
     ' Do your lengthy stuff here -- this will happen in a separate thread. 
     ' If you want to do UI operations here, you need to use Control.Invoke. 
    End Sub 

AddHandler bw.RunWorkerCompleted, 
    Sub(sender, args) 
     ' We are back in the UI thread here. 
     If args.Error IsNot Nothing Then ' If an exception occurred during DoWork, 
      MsgBox(args.Error.ToString()) ' do your error handling here 
     End If 

     ' Re-enable your button and change the text back here: 
     ... 
    End Sub 

' Disable your button and change the text here: 
... 

bw.RunWorkerAsync() ' Start the Background Worker 

(Конечно, если вам не нравится AddHandler, используя экземпляр WithEvents переменная для BackgroundWorker и ключевое слово Handles так же хороши и более типичны для VB.)

Обратите внимание, что в этом случае пользователь может взаимодействовать с вашим пользовательским интерфейсом во время работы. Это может быть полезно (вы можете добавить кнопку «прерывание», которая устанавливает флаг, который отмечен в вашей длительной операции), но вам нужно убедиться, что не могут произойти какие-либо плохие вещи, например. деактивируйте кнопку, чтобы одна и та же операция не могла быть запущена дважды.

+0

Вы правы, материал, который я делал внутри обработчика кликов, занял много времени, и лучше сделать его в своем потоке, а не повесить поток пользовательского интерфейса, спасибо. – CHollman82

1

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

+0

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

+0

@ CHollman82, не могли бы вы попытаться дать нам представление о том, почему? –

 Смежные вопросы

  • Нет связанных вопросов^_^