如何将 winform 子表单动态嵌入到主 winform 的选项卡控件中?
Posted
技术标签:
【中文标题】如何将 winform 子表单动态嵌入到主 winform 的选项卡控件中?【英文标题】:How do I dynamically embed a winform subform into the tab control of a main winform? 【发布时间】:2011-05-19 15:08:46 【问题描述】:有没有一种方法可以将 Winforms 表单对象交给包含选项卡控件的主表单,并让主表单将此表单对象加载到其中一个选项卡中?
另一个问题:表单对象将从不同于主表单的线程实例化。
【问题讨论】:
【参考方案1】:我认为在不同线程上创建表单时它不会起作用,但您通常可以通过将表单的 TopLevel 属性设置为 False 然后将其添加到选项卡页控件(或任何其他父控件)来执行此操作.
编辑:您还需要将 Visible 属性设置为 True,因为默认情况下表单是隐藏的。
另外,我刚刚尝试过,它确实适用于从另一个线程创建的按钮之类的东西。但是当我使用表单执行此操作时,我得到了一个 InvalidOperationException。
【讨论】:
是否将其添加到标签页的 Controls 集合中? 可以,也可以将Form的Parent属性设置为标签页控件。 顺便说一句,更好的方法是使用 SwDevMan81 建议的 MDI 接口。 MDI 界面按照您的预期处理子窗体的布局和管理。 哟,我想我在 UB 和你一起做了一个 CSE305 项目(哈哈,完全跑题了)。那是 lisp turtle 的 tag 游戏。【参考方案2】:你想要Multi Document Interface (MDI) tab page browsing这样的东西吗?
【讨论】:
可能。但是主窗体的设计已经有点锁定了。【参考方案3】:您应该可以从TabPage
的Controls
集合中调用Add
。您可能需要相应地设置 Anchor
和 Dock
属性,以便控件填充整个表面(假设这是您想要的)。
我不认为从另一个线程创建控件是一个好方法。我敢肯定,只要使用适当的同步机制等,您就完全有能力使这种切换线程安全。但是,所有 UI 元素都具有线程关联性,这意味着一旦创建了 UI 元素,它就属于创建线程。简单地创建(只是一个构造函数调用)可能没有任何问题,但我采取的规则是在 UI 线程上保持 all UI 元素逻辑非常严格。
【讨论】:
您不能只将表单添加到另一个控件。它会抛出异常。您必须首先将其 TopLevel 属性设置为 False。以上是关于如何将 winform 子表单动态嵌入到主 winform 的选项卡控件中?的主要内容,如果未能解决你的问题,请参考以下文章
Access 2007 使用选项卡将多个子表单链接到主表单的最佳方式