【问题标题】:Can I host a Windows Form inside a control我可以在控件中托管 Windows 窗体吗
【发布时间】:2011-10-07 18:36:06
【问题描述】:

我有一个客户,它是一个带有有线表示逻辑的单实例模式的 Visual Basic 项目。

主窗体包含一个带有多个 TabPage 的 TabControl。 如果我点击 TabPageA 另一个表单会显示在表单前面并调整大小以与 TabPage 具有相同的大小。

如果我点击 TabPageB,第一个表单被隐藏,另一个表单被显示。 所以基本上对于用户来说,看起来你有一个带有不同 TabPages 的 TabControl,但事实并非如此。

我尝试将 Forms 转换为 UserControls 并将它们放在 TabPage 中,但是,由于 SingleInstance 应用程序,这需要大量的重构。我尝试过,但最终因为许多运行时错误而放弃了,我不想再为此付出任何努力。

我的想法是,在运行时,我可以将表单添加到 TabPages 并让它们像 UserControls 一样工作,这可能吗?

【问题讨论】:

  • 您可以尝试获取表单控件数组的副本并将其推入另一个控件的新面板中。
  • 你看过MDI吗?也许您可以用菜单项替换选项卡控件,以便主窗口可以从菜单栏打开子窗口。

标签: .net vb.net winforms user-controls


【解决方案1】:

您可以通过将 Form 类的 TopLevel 属性设置为 False 将其转回子控件。它本质上变成了一个带有一些未使用开销的 UserControl。让它看起来像这样:

Public Class Form1
    Public Sub New()
        InitializeComponent()
        Dim frm As New Form2
        frm.TopLevel = False
        frm.FormBorderStyle = Windows.Forms.FormBorderStyle.None
        frm.Visible = True
        frm.Dock = DockStyle.Fill
        TabPage1.Controls.Add(frm)
    End Sub
End Class

【讨论】:

  • 这是一个了不起的答案。一直以来,我一直在与所有者一起设置它并处理动作……+5!
  • 很好。我会尝试一下,但看起来很有希望。
  • 3 年后这仍然是救生员!我的意思是,面板中的表格,你一生都在哪里?!!!上帝保佑你先生:)
【解决方案2】:

任何窗口都可以使用SetParent 托管在任何其他窗口中(从技术上讲,控件是一个窗口)。

<System.Runtime.InteropServices.DllImport("user32.dll")>
Public Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr

End Function

声明和

SetParent(FormToHost.Handle, ControlToHostForm.Handle)

使用。这可能并不理想,但如果您不想像您说的那样为此付出更多努力,那也没关系。表单将正确最大化和最小化,并且不会显示在任务栏中,并且会与它们的容器一起关闭。

【讨论】:

  • 虽然 Hans 的建议更适合这个问题,但它的优点是它也适用于其他类型的窗口。
  • 我很久以前就用它来“停靠”我的第 3 方应用程序。当心其他应用程序中的任何“热键”(即使在应用程序没有焦点时也能在应用程序中执行功能的键)功能。您可能会破坏该功能。
【解决方案3】:

您可以使用面板。在每个选项卡中,必须显示一个或多个不同的面板或其他面板,否则必须隐藏其他面板。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多