提高 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,然后修改您的代码以仅切换一个图片框显示的图像。
基本步骤如下:
在 Solution Explorer 中右键单击您的项目,然后按 Properties。
Select 资源 选项卡。
要添加图像:
一个。将图像拖放到资源窗格中。
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
我目前正在处理一个项目,并决定使用 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,然后修改您的代码以仅切换一个图片框显示的图像。
基本步骤如下:
在 Solution Explorer 中右键单击您的项目,然后按 Properties。
Select 资源 选项卡。
要添加图像:
一个。将图像拖放到资源窗格中。
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