【问题标题】:How do I dynamically embed a winform subform into the tab control of a main winform?如何将 winform 子表单动态嵌入到主 winform 的选项卡控件中?
【发布时间】:2011-05-19 15:08:46
【问题描述】:

有没有一种方法可以将 Winforms 表单对象交给包含选项卡控件的主表单,并让主表单将此表单对象加载到其中一个选项卡中?

另一个问题:表单对象将从不同于主表单的线程实例化。

【问题讨论】:

    标签: c# winforms multithreading tabcontrol subforms


    【解决方案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】:

    您应该可以从TabPageControls 集合中调用Add。您可能需要相应地设置 AnchorDock 属性,以便控件填充整个表面(假设这是您想要的)。

    我不认为从另一个线程创建控件是一个好方法。我敢肯定,只要使用适当的同步机制等,您就完全有能力使这种切换线程安全。但是,所有 UI 元素都具有线程关联性,这意味着一旦创建了 UI 元素,它就属于创建线程。简单地创建(只是一个构造函数调用)可能没有任何问题,但我采取的规则是在 UI 线程上保持 all UI 元素逻辑非常严格。

    【讨论】:

    • 您不能只将表单添加到另一个控件。它会抛出异常。您必须首先将其 TopLevel 属性设置为 False。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多