vb.net winforms在顶部显示表单对话框



我有一个充当等待表单的表单,基本上它是最大化的,除了显示微调器动画 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设置为NoneStartPosition设置为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

我添加了一个ButtonForm1以及以下代码:

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"。

最新更新