我有一个充当等待表单的表单,基本上它是最大化的,除了显示微调器动画 GIF 的中心之外,大部分都是透明的。
我还有一个显示为对话框的表单。在此对话框的 Load 事件中,有一个由第三方控件完成的长时间运行的进程。所以我要做的是在对话框加载时,显示等待表单,然后在完成后关闭等待表单。
Private Async Sub frmFullScreen_Load(sender As Object, e As EventArgs) Handles Me.Load
Using waitingDialog As frmWaiting = New frmWaiting()
waitingDialog.Show(Me)
await Task.Run(Sub()
await control.LongRunningMethod()
End Sub)
frmWaiting.Close()
End Using
End Sub
我遇到的问题是表单已显示,但我猜测它显示在对话框后面,因为我从未看到它。
我尝试将 frmWait 的 TopMost 属性的实例设置为 True,但这仍然没有在对话框中显示等待表单。任何帮助,不胜感激。
我还没有测试过这个,但是如果你要设计你的等待表单,让它将委托作为构造函数参数或通过属性,在显示时异步执行该委托,然后在委托完成时关闭自己?这样,您可以在表单上调用ShowDialog
而不是Show
,这可能会缓解问题。这可能还意味着您不需要制作全屏透明表单来阻止访问其他表单。我将尝试整理一个例子。
编辑:
好的,这就是对我有用的方法。我创建了一个包含三种窗体的新 WinForms 项目。然后,我使用以下代码添加了一个名为TextBoxEx
的新类:
Public Class TextBoxEx
Inherits TextBox
Public Async Function DelayAndSayHello() As Task
Await Task.Delay(5000)
Invoke(Sub() Text = "Hello World")
End Function
End Class
然后,我生成了该项目,之后该TextBoxEx
控件将自动添加到工具箱中。
然后,我在Form3
中添加了一个ProgressBar
,并将Style
设置为Marquee
。我把Form3
做得很小,并放大了ProgressBar
以填充大部分。我将FormBorderStyle
设置为None
,StartPosition
设置为CenterScreen
并添加了以下代码:
Public Class Form3
Public Property Method As Func(Of Task)
Private Async Sub Form3_Shown(sender As Object, e As EventArgs) Handles Me.Shown
If Method IsNot Nothing Then
Await Task.Run(Method)
End If
Close()
End Sub
End Class
我添加了一个TextBoxEx
控件以及以下代码Form2
:
Public Class Form2
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Using f3 As New Form3 With {.Method = AddressOf TextBoxEx1.DelayAndSayHello}
f3.ShowDialog()
End Using
End Sub
End Class
我添加了一个Button
Form1
以及以下代码:
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Using f2 As New Form2
f2.ShowDialog()
End Using
End Sub
End Class
然后我运行了该项目并单击Form1
上的Button
。屏幕中央显示无边框的小对话框,ProgressBar
滚动。显示Form3
时,我无法访问Form1
。5秒后,Form3
消失,Form2
显示TextBox
中显示"Hello World"。