#vb.net
#vb.net
Вопрос:
Ах, да. Это довольно прямолинейно. Я создал ярлык в разделе дизайна формы (Label1), и Label1.text не работает.
Public Class Countdown
Private WithEvents CountDwnTimer As New Timer() With {.Interval = 1000}
Public CountdownValue = 6
Private Sub Countdown_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.FormBorderStyle = FormBorderStyle.None
Me.WindowState = FormWindowState.Maximized
AddHandler CountDwnTimer.Tick, AddressOf CountDwnTimer_Tick
CountDwnTimer.Start()
End Sub
Private Sub CountDwnTimer_Tick(sender As Object, e As EventArgs)
If CountdownValue > 0 Then
CountdownValue -= 1
Label1.Text = CountdownValue.ToString
ElseIf CountdownValue = 0 Then
CountDwnTimer.Stop()
Me.BackColor = Color.White
Me.Opacity = 100
Label1.ForeColor = Color.Black
Label1.BackColor = Color.White
Label1.Text = "Capturing, don't move your mouse!"
Threading.Thread.Sleep(2000)
Me.Hide()
Else
MessageBox.Show("Error! Application flow interrupted.")
End If
End Sub
End Class
Это мой код. Обратите внимание, что обратный отсчет работает нормально (этот код изменяет метку, чтобы показывать обратный отсчет), но когда я пытаюсь это сделать Label1.Text = "Capturing, don't move your mouse!"
, это не работает! Кроме того, Label1.BackColor = Color.White
не работает. Похоже, это связано только с кодом метки, потому что код после него работает.
Я просто вижу очевидную проблему?
Спасибо.
Ответ №1:
Как бы то ни было, изменения, которые вы вносите в эти свойства, на самом деле не могут отображаться до тех пор, пока этот метод не завершится, но вы сразу же переводите поток пользовательского интерфейса в спящий режим, а затем скрываете форму. Вам нужно будет вызвать Refresh
Label
after, установив его свойства, чтобы принудительно отобразить изменения перед выполнением последующего кода.
Комментарии:
1. Осмелюсь ли я произнести «Заявление. DoEvents()»? (Лучше не …)
2. @SteveCinq, это, вероятно, сработало бы, но я бы предпочел быть более откровенным и обновить
Label
информацию конкретно. Тем не менее, мне, вероятно, это не понадобилось бы, потому что вместо того, чтобы переводить поток пользовательского интерфейса в спящий режим на 2 секунды, я бы, вероятно, использовал aTimer
для задержки этих двух секунд, прежде чем действовать, и в этом случае поток пользовательского интерфейса доступен для обновленияLabel
естественным образом.3. Я имел в виду тот факт, что
DoEvents()
это имеет плохую репутацию и часто помечается как запах кода. Я избегаю этого, насколько это возможно, но, ну, эм, эм… (Кстати, я не смог пометить вас в этом комментарии, возможно, потому, что вы также являетесь автором ответа. Не знаю.)