0

我试图为我的项目获取可以满足我需求的表单配置,没有找到解决方案。看来我找到了解决方案,现在我必须在应用程序范围内实现它。

在这里,我有主窗体和一些子窗体(有许多子窗体),通过主窗体,我应该始终能够关闭所有打开的窗体,监视通用按键,永久关闭应用程序并监视关键事件。

我在这个事实中找到了解决方案:

  • 从主窗体我打开实例化但非模态的主子窗体。
  • 从子表单中,我打开更深层的子表单,也实例化和非模态。
    在所有这些子表单 _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功能需求从外部切换属性?

4

1 回答 1

1

在我看来,“cls_transform”实际上是一个派生自 Form 的类,这是 OnFormClosing 可以工作的唯一方式。没关系,您的“子表单”现在需要从 cls_transform 而不是 Form 派生。请选择一个更好的名字。

然后只需将 Blocking 属性添加到该 cls_transform 类即可解决您的问题。

请注意,您的 OnFormClosing 方法中有一个错误。它可以被取消,这将使表单的所有者处于错误状态。你需要这样写:

Protected Overrides Sub OnFormClosing(ByVal e As System.Windows.Forms.FormClosingEventArgs)
    MyBase.OnFormClosing(e)
    If Not e.Cancel And Blocking And Me.Owner IsNot Nothing Then
        Me.Owner.Enabled = True
        Me.Owner.Activate()
    End If
End Sub
于 2013-10-16T17:28:18.190 回答