如何在主WinForm的选项卡控件中动态嵌入WinForm子窗体?

4
有没有一种方法可以将Winforms窗体对象传递给包含选项卡控件的主窗体,并使主窗体将此窗体对象加载到其中一个选项卡中?
另一个问题是:该窗体对象将从与主窗体不同的线程实例化。
3个回答

4

我认为当窗体在不同的线程上创建时,这种方法可能行不通。但是您通常可以通过将窗体的TopLevel属性设置为False,然后将其添加到选项卡页控件(或任何其他父控件)来实现。

编辑:您还需要将Visible属性设置为True,因为窗体默认情况下是隐藏的。

另外,我刚试了一下,对于从另一个线程创建的按钮之类的东西,这种方法确实可行。但是,当我使用窗体时,我收到了InvalidOperationException异常。


我应该将它添加到选项卡页的控件集合中吗? - Robert Harvey
是的,或者您可以将窗体的 Parent 属性设置为选项卡页控件。 - Mike Dour
顺便说一下,更好的方法是使用SwDevMan81建议的MDI界面。MDI界面处理子窗体的布局和管理,正如您所期望的那样。 - Mike Dour
哟,我想我和你一起在UB做过一个CSE305项目(哈哈完全跑题)。那是关于Lisp语言的乌龟标记游戏。 - SwDevMan81

3
您是否需要类似于多文档界面(MDI)选项卡浏览的功能?请参考此链接

可能。但是主表单的设计已经有点固定了。 - Robert Harvey

2
您可以直接从TabPageControls集合中调用Add。您可能需要相应地设置AnchorDock属性,以便控件填充整个表面(假设这是您想要的)。
我认为不应该从另一个线程创建控件。我相信您能够使用适当的同步机制等使其安全地传递。但是,所有UI元素都具有线程关联性,这意味着一旦创建了该UI元素,它就属于创建线程。您可能没有任何问题,只需创建(仅构造函数调用),但我将严格按照保留所有 UI元素逻辑在UI线程上的规则进行处理。

你不能直接将一个窗体添加到另一个控件中,否则会抛出异常。你必须先将其TopLevel属性设置为False。 - Mike Dour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接