.net Winforms-将表单嵌入表单或容器会导致表单控件的行为不同

.net Winforms-将表单嵌入表单或容器会导致表单控件的行为不同,.net,winforms,.net,Winforms,修订内容质量 我们根据客户的需求为他们构建了基于表单的应用程序。项目快结束时,他们决定让该应用程序作为另一个Winforms应用程序的一部分运行,要求屏幕包含在更大的表单中。他们还希望动态加载表单和其他UI元素。我决定尝试在另一个表单中动态加载表单,当时,我不习惯将所有表单转换为控件 当我在另一个表单或容器控件中动态加载表单时,内部表单组件的编辑行为会发生变化。文本编辑,在文本框或组合框中,不允许我用鼠标选择部分文本,尽管我可以双击选择控件中的所有文本 FormChild form =

修订内容质量

我们根据客户的需求为他们构建了基于表单的应用程序。项目快结束时,他们决定让该应用程序作为另一个Winforms应用程序的一部分运行,要求屏幕包含在更大的表单中。他们还希望动态加载表单和其他UI元素。我决定尝试在另一个表单中动态加载表单,当时,我不习惯将所有表单转换为控件

当我在另一个表单或容器控件中动态加载表单时,内部表单组件的编辑行为会发生变化。文本编辑,在文本框或组合框中,不允许我用鼠标选择部分文本,尽管我可以双击选择控件中的所有文本

     FormChild form = new FormChild();
     form.TopLevel = false;
     form.Dock = DockStyle.Fill;
     Controls.Clear();
     Controls.Add(form);
     form.Show();
当我使用show或ShowDialog正常显示表单时,控件会按预期工作,但嵌套时则不会

从多年的MFC经验来看,我们对Winforms有点陌生,我们有使用FormView在MFC控件中嵌入表单的经验,所以我们假设它在Winforms中可以正常工作。结果不是这样的

解决方案:我应该首先使用一个用户控件。我手动重构了应用程序中的每个表单,创建了空白控件,将InitializeComponent以及逻辑剪切并粘贴到用户控件中。至于动态组件,现在我在运行时创建它们,或者在IronPython中创建它们。四年后,我回头看这个问题,对我的新手错误摇头


此外,我发现可停靠面板内的控件对于我所面临的原始场景非常有效。具体来说,我开始使用DevExpress的DocumentManager和DockPanel。我当时对Winforms的缺乏经验使我们陷入了麻烦;我留下了这个问题,以防其他人犯同样的错误。

是否可以将表单中的所有功能(包括控件)放入用户控件中?如果希望在单独的表单中使用此功能,请将用户控件放到空表单中;如果希望将其作为现有表单的一部分,请将其放到该表单中


这并不是您提出的问题的解决方案,但这个建议可能会有所帮助。

根据您发布的内容判断,您希望动态加载一些ui元素,并且仅在加载完成后才显示它们?我通常会用“面板”或用户控件来完成

[未编译测试代码]


简而言之,你想要的是可能的,只需看看这里:


这完全是导入SetParent并使用它的问题。这会有一些开销——您必须处理子位置的大小和位置——但在大多数情况下不会有太大的开销

也许只有我一个人,但将表单加载到面板中似乎很奇怪……winforms中的表单在许多其他系统中都是等效的窗口。+1:同意,我不知道为什么它不起作用,但我相信有更好的方法来实现这一点,而不必在面板中嵌入表单。表单通常是外部容器。+1:我也是。我从来没有考虑过这样的事情。如果你不介意我问一下,在面板中嵌入表单的理由是什么?你所做的在MFC中可能并不奇怪,但在winforms中是这样的。他们是不同的。表单通常有[最小化][最大化][关闭]以及与窗口相关的其他内容无论如何,说这很奇怪不是解决办法。。。这就是为什么noone发布了一个答案,只是评论:我已经设计了所有的表单,然后客户要求我不要显示新的对话框,而是将其加载到一个内容区域,所以我走了这条路线。我想最好把所有的表单转换成控件。我不知道你正在处理多少个表格或者它们的复杂度,但是你可以考虑至少用简单的表单来测试它,并把它转换成UC.DIN。将其中一个转换为控件解决了此问题。谢谢你的建议。是时候开始转换了…:备选方案:谢谢。我想我应该首先使用用户控件而不是表单。当客户要求将表单放入内容区时,我已经对表单进行了编码,所以我选择了我想到的第一条路线。我不是WinForms大师,这是我第一次在WinForms中尝试,尽管我仍然不理解这种行为的原因。否则表单会运行良好。@joltcola-Ouch先生……希望表单不会太多。您可以从*.designer.cs文件+1中复制大部分代码,谢谢您的建议。现在,将表单转换为控件似乎是最好的方法。
Panel p = new Panel();
p.TopLevel = false;
p.Dock = DockStyle.Fill;
p.Controls.Add( button );
// etc
Controls.Clear();
Controls.Add(p);