提高 UI 对 windows 表单应用程序的响应速度

Improve UI responsiveness on windows form application

我目前正在处理一个项目,并决定使用 visual studio 和 windows 表单应用程序(Visual Basic)为其创建一个用户界面。

我面临的问题是用户界面没有像我希望的那样快速和流畅地响应。 主要是,我使用图片作为按钮,使用户表单看起来更现代。 但是,当我将鼠标悬停在 "button" 上时,需要一段时间才能出现 "highlighted button"。

P1 是 "normal button" 的图片,P2 是 "highlighted button" 的图片。

这是我目前拥有的短代码:

Public Class Main

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load


End Sub

Private Sub PictureBox1_MouseHover(sender As Object, e As EventArgs) Handles P1.MouseHover
    P1.Visible = False
    P2.Visible = True
End Sub

Private Sub P2_MouseClick(sender As Object, e As MouseEventArgs) Handles P2.MouseClick
    'Call cmdInit()
    'Call cmdConnectRobot()
    'Call cmdUnlock()
End Sub

Private Sub Main_MouseHover(sender As Object, e As EventArgs) Handles Me.MouseHover
    If P2.Visible = True Then
        P2.Visible = False
        P1.Visible = True
    End If
End Sub

Private Sub P4_Click(sender As Object, e As EventArgs) Handles P4.Click

End Sub
End Class

我面临的另一个问题是,当我调用其他 sub 时,当 sub 处于 运行 时,用户表单变得无响应。 我研究并发现我可以实现多线程或异步任务,但我有点迷茫,如果有人能指导我或指出正确的方向,我将不胜感激。

提前致谢!!

首先我要说我不是职业程序员,我相信有人会指出做这些事情的更好方法,但关于线程问题,它实现起来相当简单。

Imports System.Threading
Public Class Form1
Dim WorkerThread As New Thread(AddressOf DoWork)

'WorkerThread'可以是你喜欢的任何名字,'DoWork'是你想在新线程中运行的sub的名字,通过调用:

WorkerThread.start()

但是有一个问题,新线程无法直接与 GUI 交互,因此您不能更改文本框文本等...我发现对 GUI 进行更改的最简单方法是拖动一个计时器到您的表单上,并让新线程更改变量(在 Public Class Form1 下方预定义),然后使用 Timer1 Tick 事件监视变量并在有任何更改时更新 GUI .

在这种情况下,您的 UI 是有响应的,但是 MouseHover event 只有在鼠标光标悬停在控件上一段时间(默认为 400 毫秒)后才会出现,这是造成延迟的原因。

你要找的是MouseEnter event,光标一进入("touches")控件就会出现:

Private Sub P1_MouseEnter(sender As Object, e As EventArgs) Handles P1.MouseEnter
    P1.Visible = False
    P2.Visible = True
End Sub

然后您可以将它与第二个图片框上的 MouseLeave event 一起使用以切换回非突出显示的图像:

Private Sub P2_MouseLeave(sender As Object, e As EventArgs) Handles P2.MouseLeave
    P1.Visible = True
    P2.Visible = False
End Sub

然而,像这样切换图片框并不是最佳选择。我建议您研究如何使用 Application Resources,然后修改您的代码以仅切换一个图片框显示的图像。

基本步骤如下:

  1. Solution Explorer 中右键单击您的项目,然后按 Properties

  2. Select 资源 选项卡。

  3. 要添加图像:

    一个。将图像拖放到资源窗格中。

    b。单击 添加资源... 按钮旁边的箭头,然后按 添加现有文件....

现在,在您的代码中将其添加到 Public Class Form1 下方:

Dim ButtonNormal As Image = My.Resources.<first image name>
Dim ButtonHighlighted As Image = My.Resources.<second image name>

<first image name><second image name> 替换为您的按钮图片的名称。

现在按钮只需要一个图片框:

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    P1.Image = ButtonNormal
End Sub

Private Sub P1_MouseEnter(sender As System.Object, e As System.EventArgs) Handles P1.MouseEnter
    P1.Image = ButtonHighlighted
End Sub

Private Sub P1_MouseLeave(sender As System.Object, e As System.EventArgs) Handles P1.MouseLeave
    P1.Image = ButtonNormal
End Sub