1

私はこのカスタムクラスを持っています

Public Class labelScroll
    Inherits Label

    Public Shadows Property Text As String
        Get
            Return MyBase.Text
        End Get
        Set(ByVal value As String)
            Dim add As String = ""
            Dim result As String()
            Dim i As Integer
            result = Split(value, vbLf)
            Dim n As Integer = 30
            If (result.Length < n) Then
                n = result.Length
            End If
            Dim start As Integer = result.Length - n
            For i = start To result.Length - 1 Step 1
                add += result(i) + Environment.NewLine
            Next
            MyBase.Text = add
        End Set
    End Property
End Class

このlabelScrollを配置し、ボタンも配置したフォームがあります。ボタンのクリックイベント用の次のコードがあります。

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    LabelScroll1.Text = "1"
    Threading.Thread.Sleep(1000)
    LabelScroll1.Text += "2"
    Threading.Thread.Sleep(1000)
    LabelScroll1.Text += "3"
End Sub

ボタンをクリックすると2秒かかり、3行に「1」「2」「3」と表示されます。実際に起こるべきことは、ユーザーがボタンをクリックすると、「1」が表示Threading.Thread.Sleep(1000)されてから実行されるため、プログラムは1秒間待機してから、次の行に「2」を出力します。

なぜこれが起こらないのですか?

4

1 に答える 1

4

ラベルにテキストを設定すると、コントロールが無効になります。つまり、次にイベントキューが処理されたときに(効果的に)再描画されます。これは、UIスレッドでスリープしている間は発生しませんMyBase.Update()。MyBase.Text= ...行の直後に追加して、すぐに更新を強制してみてください。

于 2012-12-11T20:47:06.880 に答える