Label1.text и Label1.backcolor ничего не меняют

#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 секунды, я бы, вероятно, использовал a Timer для задержки этих двух секунд, прежде чем действовать, и в этом случае поток пользовательского интерфейса доступен для обновления Label естественным образом.

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