我正在开发一个简单的 VB.NET 程序(仅使用winforms(,并且在UI管理方面非常糟糕。我希望有一个按钮来启动一个进程,然后让同一个按钮停止进程。
我正在考虑让主窗体启动一个计数器,Click
事件迭代计数器。然后它做一个简单的检查,如果计数器是偶数,它将做事情A,奇数做事情B。
除了使用两个按钮或停止/启动单选按钮之外,还有没有更好的方法?
我已经用两种方式之一做了那件事。 您可以使用静态变量或切换按钮的文本。
由于您的按钮有两个功能,因此好的设计要求您向用户指示。 以下代码假定按钮的文本在设计模式下设置为"开始",并且用于启动和停止进程的代码位于子启动进程和结束进程中。
Public Sub Button1_Click(ByVal Sender as Object, ByVal e as System.EventArgs)
If Button1.Text ="Start" Then
StartProcess()
Button1.Text="End"
Else
EndProcess()
Button1.Text="Start"
End IF
End Sub
编辑
上述解决方案适用于由少数开发人员开发的单语言应用程序。
为了支持多种语言,开发人员通常会分配支持文件或数据库中的所有文本文本。 在具有多个程序员的大型开发车间中,使用控件的显示功能进行流控制可能会导致混淆和回归错误。 在这些卡司中,上述技术是行不通的。
相反,您可以使用按钮的 Tag 属性,该属性保存一个对象。我通常会使用布尔值,但我使用字符串只是为了更清楚地了解发生了什么。
Public Sub New()
'Initialize the Tag
Button1.Tag="Start"
End Sub
Public Sub Button1_Click(ByVal Sender as Object, ByVal e as System.EventArgs)
If Button1.Tag.ToString="Start" Then
StartProcess()
Button1.Tag="End"
Else
EndProcess()
Button1.Tag="Start"
End IF
End Sub
伪代码中的示例。我不保证方法和事件的名称与真实名称完全匹配。但这应该为您提供可用于响应式表单的设计。
比方说,您的进程在单独的胎面上运行,使用 BackgroundWorker
.设置工作线程并启动流程
Class MyForm
private _isRunning as boolean
private _bgWorker as BackgroundWorker
sub buton_click()
If Not _isRunning Then
_isRunning = true;
StartProcess()
Else
StopProcess()
End if
end sub
sub StartProcess()
' Setup your worker
' Wire DoWork
' Wire on Progress
' wire on End
_bgWorker.RunWorkerAsync()
End sub
sub StopProcess()
if _isRunning andAlso _bgWorker.IsBusy then
' Send signal to worker to end processed
_bgWorker.CancelAsync()
end if
end sub
sub DoWork()
worker.ReportProgress(data) ' report progress with status like <Started>
' periodically check if process canceled
if worker.canceled then
worker.ReportProgress(data) ' report progress with status like <Cancelling>
return
end if
' Do your process and report more progress here with status like <In Progress>
' and again periodically check if process canceled
if worker.canceled then
worker.ReportProgress(data) ' report progress with status like <Cancelling>
return
end if
worker.ReportProgress(data) ' report progress with status like <Ending>
end sub
sub ReportProgress(data)
if data = <some process state, like "Started"> then
btnProcess.Text = "End Process"
end if
End sub
sub ReportEndOfProcess
btnProcess.Text = "Start Process"
_isRunning = false
end sub
End Class
在这里,您可以精确定位方法和事件的名称您必须将标识符替换为真实名称并创建状态或数据对象,它将从后台线程传递到 UI 线程的信息,以及可以成为自定义状态对象一部分的Enum Status
。一旦转换为真实代码,这应该可以工作
只是想展示此任务的另一种方法将.Tag
财产用于您自己的目的如果.Tag
什么都没有(默认情况下在设计器中(,则启动进程
如果不是 Nothing -> 停止进程
Public Sub Button1_Click(ByVal Sender as Object, ByVal e as System.EventArgs)
If Me.Button1.Tag Is Nothing Then
StartProcess()
Me.Button1.Tag = New Object()
Me.Button1.Text = "End"
Else
EndProcess()
Me.Button1.Tag = Nothing
Me.Button1.Text = "Start"
End
End Sub