(针对内容质量进行了修订)
我们已根据客户的要求为客户构建了基于表单的应用程序。在项目结束时,他们决定让应用程序作为另一个Winforms应用程序的一部分运行,其方式要求屏幕包含在更大的表单中。他们还想动态加载表单和其他UI元素。我决定尝试在另一个表单中动态加载表单,当时,不习惯将所有表单转换为控件。
当我在另一个表单或容器控件中动态加载表单时,内部表单组件的编辑行为会发生变化。 TextBox或ComboBox中的文本编辑不允许我用鼠标选择部分文本,但我可以双击选择控件中的所有文本。
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的时候缺乏经验让我们陷入困境;我已经离开了这个问题以防其他人犯了同样的错误。
答案 0 :(得分:3)
是否可以将表单中的所有功能(包括控件)放入用户控件中?如果您希望以单独的形式使用此功能,请将用户控件拖放到空表单中,如果您希望将其作为现有表单的一部分,请将其放入该表单中。
这不是你提出的问题的解决方案,但也许这个建议会有所帮助。
答案 1 :(得分:1)
根据你发布的内容判断,你想动态加载一些ui元素,只有在完成加载后才显示它们?我通常会使用“面板”或用户控件
来完成[未编译测试代码]
Panel p = new Panel();
p.TopLevel = false;
p.Dock = DockStyle.Fill;
p.Controls.Add( button );
// etc
Controls.Clear();
Controls.Add(p);
答案 2 :(得分:1)
简而言之,您想要的是什么,请看这里:
http://social.msdn.microsoft.com/Forums/en/winforms/thread/a5a5ace5-2f88-4ed3-b1e5-ec3500ce1df1
这都是导入SetParent并使用它的问题。会有一些开销 - 您将不得不处理子位置的大小和位置 - 但在大多数情况下并不是很多。