仅将值写入如此少量的标签是一个非常快速的过程。您遇到的问题很可能与刷新 GUI 控件内容时的 VB.NET“问题”有关;正如 FraserOfSmeg 所建议的,解决此问题的最佳方法是研究多线程。
就我而言,这是一个非常简单的 GUI,具有少量控件和不太苛刻的算法(大量/长循环是 GUI 刷新问题的主要原因),即使没有,您也可以获得可接受的性能依赖多线程。在您的情况下,我会执行以下操作:
- 一个容器(
TableLayoutPanel
您正在使用的或更简单的东西,例如 a Panel
),包括开头的所有标签。如果不会变得太乱(似乎不是这样,只有 42 个标签),我会将它们包含在“设计视图”中(而不是在运行时)。
- 根据给定月份填充所有标签的函数。
- 每次用户选择不同的月份时,都会调用容器的“过渡效果”。您可以通过重新定位容器很容易地完成此操作
Timer
(例如,当单击按钮时,容器的位置设置在表单之外,然后逐渐返回(每 10 毫秒 20 点 -> 编造的数字)直到回到原来的位置位置)。
- 同步上述两点:标签的值将在过渡开始时开始变化;通过这种方式,用户不会注意到任何事情(只是每个月的一个非常吸引人的过渡)。
这个 GUI 应该提供您所追求的那种性能。如果没有,您应该依靠其他方法(例如,建议的多线程)来提高其性能。
说明第 3 点的示例代码
将面板 ( Panel1
)、按钮 ( Button1
) 和计时器 ( Timer1
) 添加到新表单和下面的代码中。
Public Class Form1
Dim curX, origX, timerInterval, XIncrease As Integer
Dim moving As Boolean
Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
If (curX >= origX) Then
If (moving) Then
curX = Panel1.Location.X
moving = False
Timer1.Stop()
Else
curX = 0 'getting it out of the screen
moving = True
End If
Else
curX = curX + XIncrease
End If
Panel1.Location = New Point(curX, Panel1.Location.Y)
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Timer1.Start()
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
XIncrease = 100
timerInterval = 100
Panel1.BackColor = Color.Maroon
origX = Panel1.Location.X
curX = origX
With Timer1
.Enabled = False
.Interval = timerInterval
End With
End Sub
End Class
这非常简单,但清楚地表明了这个想法:当您单击按钮时,面板会在 X 中移动;通过影响timerInterval
和XIncrease
值,您可以获得漂亮的过渡(有很多选项,请记住,如果您设置curX
为减去面板的宽度,而不是为零,它会完全超出表单)。