我正在尝试在 Windows 窗体顶部使用加载叠加层,它在带有加载 GIF 的 Windows 窗体顶部添加 50% 的不透明层,同时它在后台线程中执行它需要执行的操作。叠加层是我在 onPaint 事件中绘制的窗口窗体。
加载覆盖在多个不同的表单加载上工作正常,但在 30 秒上传过程中被召唤以确保耐心时无法正常工作(将 Word 文档打印为 PDF,然后将该 PDF 上传到 SQL Server)。此上传从表单中收集一些数据,将其放入对象中,然后完全在后台线程上运行。加载覆盖将出现,显示加载 GIF 的第一帧,然后冻结。onPaint 被触发并且图像框架正在更新,但它不可见
构造函数将表单设置为 UserPainted:
Sub New()
InitializeComponent()
SetStyle(ControlStyles.UserPaint Or ControlStyles.Opaque, True)
End Sub
然后,在 Form.Shown 事件中调用 ImageAnimator.Animate 方法:
Private Sub LoadingOverlay_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
If Not currentlyAnimating Then
ImageAnimator.Animate(animatedImage, AddressOf Me.OnFrameChanged)
currentlyAnimating = True
End If
End Sub
onFrameChanged 事件处理程序只是使表单无效:
Private Sub OnFrameChanged(ByVal sender As Object, ByVal e As System.EventArgs)
'Force a call to onPaint
Me.Invalidate()
End Sub
然后 onPaint 被覆盖并绘制:
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)
'Get the next frame ready for rendering
ImageAnimator.UpdateFrames()
'Draw the next frame in the animation.
e.Graphics.DrawImage(Me.animatedImage, GetCenter(Me.animatedImage.Size))
TextRenderer.DrawText(e.Graphics, strStatus, Me.Font, GetTextLocation(Me.animatedImage.Size), Color.White, Color.Black)
End Sub
最后,在 Form Closing 事件中调用 ImageAnimator.StopAnimate 方法:
Private Sub LoadingOverlay_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
If currentlyAnimating Then
ImageAnimator.StopAnimate(animatedImage, AddressOf Me.OnFrameChanged)
currentlyAnimating = False
End If
End Sub
以下是调用和关闭加载叠加层的方式:
Private Sub ShowLoadingOverlay()
If Not blnLoadingOverlayVisible Then
Me.Enabled = False
patience = New LoadingOverlay()
patience.Location = Point.Add(parent.PointToScreen(Me.Location), New Size(0, parent.ToolStrip.Height + parent.MenuStrip.Height))
patience.Size = Me.Size
patience.Show()
patience.BringToFront()
blnLoadingOverlayVisible = True
End If
End Sub
Private Sub HideLoadingOverlay()
If blnLoadingOverlayVisible Then
'Close loading overlay'
patience.Close()
patience.Dispose()
patience = Nothing
Me.Enabled = True
blnLoadingOverlayVisible = False
End If
End Sub