我们正在尝试将我们的应用程序嵌入到另一个通过UserControl提供界面的应用程序中。
创建包含普通Windows.Form的用户控件很容易。但是如果要嵌入的表单具有属性IsMdiContainer == true,如何执行此操作?
Thx
答案 0 :(得分:0)
我认为不可能because:
多文档界面(MDI) 父表单必须是顶级表单 窗口。
如果您尝试将父级设置为MdiContainer,您将/应该获得异常。解决这个问题的唯一方法是重新设计你想要嵌入的窗口。如果没有MDI概念,或者如果您确实需要它,请将其实现为一个自定义控件,其行为类似于MDI但没有限制。 (这是一个很高的订单,很可能需要大量的自定义绘图。)
实际上有一种hack方法,您可以通过SetParent函数在运行时从其他进程重新创建窗口。因此,例如,您可以“窃取”计算器窗口应用程序并将其托管在另一个MDI中,但这往往非常不稳定,尤其是对于更复杂的应用程序。您必须将MDI应用程序作为单独的进程启动,然后从托管应用程序调用SetParent。如果上述选项都不适合您的需求,那么可能值得一试,但最可能的结果将是运行时异常。
答案 1 :(得分:0)
您可以使用以下方法,它不是自动的,但它可以完成工作。
1)在您的用户控件中,声明您的Windows应用程序,即MDI主机。 2)将创建和处理新窗口的功能映射到用户控件中的工具栏,或者将其映射到自定义控件。 3)每次创建新窗口时,都会将MDI父级设置为您在步骤1中声明的窗口。
主要观点是在这篇文章中 C# Panel As MDI Container
这种方法有一个问题。当您最大化您的子窗口时,它最大化并覆盖所有用户控制区域,您将看不到它的标题栏。我相信您可以通过将MDI子窗口的最大大小设置为小于用户控件大小来消除此错误