【问题标题】:Problem in Form Activated and Deactivate events表单激活和停用事件中的问题
【发布时间】:2011-04-03 16:13:44
【问题描述】:

场景

这是一个非 MDI 窗口应用程序。 我有一个主窗体,其中包含一个名为 Panel1 的面板和两个按钮 btnForm1 和 btnForm2。单击 btnForm1 和 btnForm2 在 Panel1 中分别打开 Form1 和 Form2。在 Panel1 中打开表单之前,会清除 Panel1 中所有打开的表单。代码如下:

Private objForm1 As Form1
Private Sub btnForm1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnForm1.Click
    objForm1 = New Form1
    objForm1.FormBorderStyle = Windows.Forms.FormBorderStyle.None
       objForm1.TopLevel = False
       objForm1.Dock = DockStyle.Fill
    Panel1.Controls.Clear
    Panel1.Controls.Add(objForm1)
    objForm1.Show()
End Sub

Private Sub btnForm2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnForm2.Click
    Dim objForm2 As New Form1
    objForm2.FormBorderStyle = Windows.Forms.FormBorderStyle.None
       objForm2.TopLevel = False
       objForm2.Dock = DockStyle.Fill
    Panel1.Controls.Clear
    Panel1.Controls.Add(objForm2)
    objForm2.Show()
End Sub

在 Form1 中有一个按钮 btnForm3,它在 Form2 上方的 frmHome.Panel1 中打开 Form3,而不清除 Panel1 中的任何现有表单。这不是由 btnForm3_Click 事件直接完成的,而是在 btnForm3_Click 中引发在此表单中声明的​​朋友事件,该事件在 frmHome 中处理。 frmHome 中处理它的代码如下:

Private Sub objForm1_LoadForm3InHome() Handles objForm1.LoadSubForm3InHome
    Dim objForm3 As New Form3
    objForm3.FormBorderStyle = Windows.Forms.FormBorderStyle.None
       objForm3.TopLevel = False
       objForm3.Dock = DockStyle.Fill
       Panel1.Controls.Add(objForm3)
       objForm3.Show()
       objForm3.BringToFront()
End Sub

所有四个表单的工具条按钮中都有添加、编辑和删除按钮,这些按钮对所有表单都是通用的。他们的菜单项中也有文件菜单。

目标

将frmHome.Panel1中当前活动窗体的菜单和工具条合并到frmHome的菜单和工具条中。将frmHome.Panel1中当前活动窗体的菜单和工具条从frmHome的菜单和工具条中取消合并 面板被停用。这可以通过在将在 frmHome.Panel1 中打开的表单中包含以下行来处理:

合并

ToolStripManager.Merge(Me.MenuStrip1, frmHome.MenuStrip1)
ToolStripManager.Merge(Me.ToolStrip1, frmHome.ToolStrip1)

取消合并

ToolStripManager.RevertMerge(frmHome.MenuStrip1)
ToolStripManager.RevertMerge(frmHome.ToolStrip1)

问题

以上几行应该写在哪些事件中? 在 MDI 应用程序中,这可以通过将它们分别包含在 Form_Activated 和 Form_Deactivate 事件中来完成。但是,当您在 frmHome.Panel1 中打开表单时,Activated 和 Deactivate 事件都不会触发。您可以使用 Form_Load 和 Form_FormClosed 事件代替 Activated 和 Deactivate,但它们只会在现有表单在面板中打开新表单之前关闭时合并/取消合并菜单。但由于我有时需要打开和关闭表单以保持现有表单处于打开状态,因此使用这些事件将无法完成任务。甚至 GotFocus 和 LostFocus 事件也不起作用。所以我希望激活和停用事件被触发,或者当表单获得/失去焦点时,菜单和工具条可以通过其他方式合并/取消合并。这真让我抓狂。我根本找不到出路。请帮忙。问候。

【问题讨论】:

  • 这个问题看起来已经回答了。你还需要什么?

标签: .net vb.net winforms .net-4.0


【解决方案1】:

好的,我已经完成了,我的结论是,处理此问题的最佳方法是使用 splitcontainer 的 ControlAdded 和 ControlRemoved 事件来检查当前添加/删除了哪个控件,并合并/取消合并该控件的工具条 w.r.t。主页表单工具条。只需编写一个全局方法来合并/取消合并带有控件名称参数的工具条(将在拆分容器中添加/删除的控件)。在 ControlAdded 和 ControlRemoved 事件中,调用以子控件为参数的方法。将我在 OP 中提到的子表单重构为 UserControls 提高了性能,但在某些情况下它们不能满足我的要求,例如当在 splitcontainer 中打开 Subform1 并立即从中打开 Subform3 而不关注 SubForm1 的任何其他控件(假设通过单击 SubForm1 上的工具条按钮)时,不会发生取消合并,因为不会触发 LostFocus、Leave 等事件。这会在菜单中产生歧义。所以我会选择Splitcontainer ControlAdded/ControlRemoved 事件。但是我不再将表单作为子控件打开,而是使用 UserControls。 最后我会提出一个小问题。如何从 SplitContainer 面板关闭 UserControl?直到现在我还在使用:

frmSubForm1.Close()
frmSubForm1=Nothing

但是 UserControls 没有任何 Close() 方法。

如果需要,请随时根据您的建议继续此主题。

【讨论】:

    猜你喜欢
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2012-06-05
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多