提高窗口窗体应用程序上的 UI 响应能力



我目前正在做一个项目,并决定使用Visual Studio和Windows Forms应用程序(Visual Basic)为其创建一个用户界面。

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

P1是"普通按钮"的图片,P2是"突出显示按钮"的图片。

这是我现在的简短代码:

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 运行时变得无响应。 我研究并发现我可以实现多线程或异步任务,但我有点迷茫,如果有人能指导我或为我指出正确的方向,我将不胜感激。

提前感谢!!

在这种情况下,UI 是响应式的,但是只有在鼠标光标悬停在控件上一定时间(默认值为 400 毫秒)时,才会引发MouseHover事件,这是导致延迟的原因。

您要查找的是MouseEnter事件,一旦光标进入("触摸")控件,就会引发该事件:

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

然后,您可以将其与第二个图片框上的MouseLeave事件一起使用,以切换回未突出显示的图像:

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

但是,像这样切换图片框并不是最佳的。我建议您研究如何使用应用程序资源,然后修改代码以仅切换一个图片框显示的图像。

以下是基本步骤:

  1. 在">解决方案资源管理器"中右击你的项目,然后按"属性"。

  2. 选择"资源"选项卡。

  3. 要添加图像之一,请执行以下操作:

    a.a. 将图像拖放到资源窗格中。

    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

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

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

"WorkerThread"可以是你喜欢的任何名称,"DoWork"是你想在新线程中运行的子的名称,通过调用以下命令启动:

WorkerThread.start()

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

相关内容

最新更新