我试图为我的项目获取可以满足我需求的表单配置,但没有找到解决方案。看来我找到了解决方案,现在我必须在应用程序范围内实现它。
在这里,我有主窗体和一些子窗体(有许多子窗体),通过主窗体,我应该始终能够关闭所有打开的窗体,监视通用按键,永久关闭应用程序并监视关键事件。
我在这个事实中找到了解决方案:
- 从主窗体我打开实例化但非模态的主子窗体。
- 从子表单中,我打开更深层的子表单,也实例化和非模态。
在所有这些子表单 _Load 事件处理程序中,我禁用调用表单并在_FormClosing
处理程序中再次启用它。这样,非模态表单就像模态表单一样为了调用者而不是为了始终保持响应的主表单!
在必须阻止自己的调用者(所有者)的表单中,我添加了属性“Blocking”,以便我的代码如下所示:
If Not formIsOpened(frm_myFirstChild) Then
Dim f As New frm_myFirstChild
f.Blocking = True
f.Show(Me)
f = Nothing
End If
在 frm_myFirstChild 我有财产:
<Browsable(True), _
DefaultValue(False)> _
Public Property Blocking() As Boolean
Get
Return _Blocking
End Get
Set(ByVal value As Boolean)
_Blocking = value
End Set
End Property
如果布尔属性“Blocking”为 TRUE,则_Load
必须执行以下代码:
If Blocking And Me.Owner IsNot Nothing Then
Me.Owner.Enabled = False
End If
在_FormClosing
那:
If Blocking And Me.Owner IsNot Nothing Then
Me.Owner.Enabled = True
Me.Owner.Activate()
End If
所有这些都按预期工作,所以我尝试为所有表单实现它,并在需要时在子类“cls_transform”中使用:
Protected Overrides Sub OnFormClosing(ByVal e As System.Windows.Forms.FormClosingEventArgs)
If Blocking And Me.Owner IsNot Nothing Then
Me.Owner.Enabled = True
Me.Owner.Activate()
End If
MyBase.OnFormClosing(e)
End Sub
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
If Blocking And Me.Owner IsNot Nothing Then
Me.Owner.Enabled = False
End If
MyBase.OnLoad(e)
End Sub
在这里,我遇到子类不理解属性Blocked
(未声明)的问题。
如何将表单的属性Blocked
设置为子类,以便我可以将这些子类用于所有表单,并根据Blocking
功能需求从外部切换属性?