【问题标题】:User Control that acts like a standard Window, only confined to a pane像标准窗口一样工作的用户控件,仅局限于窗格
【发布时间】:2011-07-03 22:44:33
【问题描述】:

我正在编写一个程序来为我生成代码,并且由于界面非常简单,我正在按照 Game Maker 设计 UI。它有一个 SplitContainer,其中 Panel1 包含一个 TreeView 和 Panel2 包含任意数量的独立窗口(真正的窗口,而不是一些 hacky 解决方法)。我想使用用户控件来存储我用来修改东西的控件,但我想不出任何办法将它放在 splitContainer 的 Panel2 内的窗口中。谁能帮帮我?

这是一个很好的例子:

http://i.stack.imgur.com/CG6kO.png

这两个精灵属性窗口是我想要做的。

【问题讨论】:

    标签: c# winforms user-controls window self-contained


    【解决方案1】:

    我认为你正在寻找的东西叫做 mdi-container

    然而,到目前为止我看到的唯一真正的 mdi 容器(在 .NET 中)是一个表单……遗憾的是没有面板或类似的东西……

    但如果您只想要“窗口中的窗口”效果:只需创建新表单,将该实例的TopLevel 属性设置为false,然后将该实例添加到您的表单/面板/splitcontainer/whatever像任何其他常用控件一样

    【讨论】:

    • 控制 MDI 遏制的不是 TopLevel,而是 IsMdiContainerMdiParent 属性。
    • @ben 是的......但 MDI 似乎要求父容器是一个表单,没有别的。我还没有找到一种方法来创建一个真正的 MDI 应用程序,它只使用 MDI 子窗口窗体上的有限区域。如果 OP 只需要“窗口中的窗口”效果,创建一个 TopLevel=false 的表单,可以像常规控件一样使用,可能就足够了
    • 正如 Stuart 所说,父窗体中的停靠点限制了 MDI 子节点可以漫游的区域。不知道有任何简单的方法可以在父母的不同区域内拥有多组孩子,但看起来 Eagle-Eye 并没有要求这样做。但是设置TopLevel = false 只是将表单变成一个弹出窗口,防止它出现在任务栏中。它的位置不限于所有者。
    • @ben ... 好的,将 TopLevel 设置为 false 后,尝试将 Form 添加到 Panel 的 Controls 属性中 ...
    【解决方案2】:

    您可以尝试使用 MDI 表单并实现您的 TreeView 控件,请查看某种停靠面板。我过去使用过这个(http://sourceforge.net/projects/dockpanelsuite/)。

    它非常灵活。您设置了这些停靠面板表单之一,停靠在 MDI 表单的左侧。它总是“在最上面”,用户可以像窗体上的拆分器控件一样调整它的大小。如果您愿意,它还可以具有“自动隐藏”功能,您的情况可能需要也可能不需要。

    然后它可以包含你的树形视图,它可以加载你喜欢的所有 MDI 子窗体。

    你会发现你并没有与“Windows”真正想要的行为作斗争,事情会运行得更顺利。

    【讨论】:

    • 这似乎正是我所需要的。另外,感谢您使用 MIT 许可证链接到某些东西。那和 zlib/zpng 是我最喜欢的许可证。
    • 图书馆最终无法正常工作,但我发现我可以制作任意数量的表单;在 MDI 父级的构造函数中,添加“IsMdiContainer = true;”。然后去:“newwindow = new FormNameGoesHere(); newwindow.MdiParent = this; newwindow.Show();”每当您想制作新的 MDI 表单时。
    【解决方案3】:

    通过 Add() 方法将其放入 Panel2 的 Control 集合中,以编程方式应用坐标、锚点和停靠。

    【讨论】:

    • 我知道如何以编程方式添加用户控件;我需要知道如何在它自己的窗口中添加一个用户控件,但仍以编程方式在面板内。
    • 如果您在表单中有一个 UserControl,嵌入,然后将该 UserControl 放入 Panel2,而不是整个表单?
    【解决方案4】:

    我曾经做过类似的事情,因此,我有 ReplaceControl 方法,我将其粘贴在下面:

        static public void ReplaceControl(Control ToReplace, Form ReplaceWith) {
            ReplaceWith.TopLevel=false;
            ReplaceWith.FormBorderStyle=FormBorderStyle.None;
            ReplaceWith.Show();
            ReplaceWith.Anchor=ToReplace.Anchor;
            ReplaceWith.Dock=ToReplace.Dock;
            ReplaceWith.Font=ToReplace.Font;
            ReplaceWith.Size=ToReplace.Size;
            ReplaceWith.Location=ToReplace.Location;
            ToReplace.Parent.Controls.Add(ReplaceWith);
            ToReplace.Visible=false;
        }
    

    剩下要做的就是在表单上手动创建一些控件,作为表单的占位符。例如,使用标签。

    来自How to implement a-form-inside-a-form with runtime embedded forms switching?

    【讨论】:

    • TreeView的节点被双击打开一个新窗口,而不是替换当前窗口。
    猜你喜欢
    • 2021-10-23
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    相关资源
    最近更新 更多