【发布时间】:2011-03-29 16:57:35
【问题描述】:
(针对内容质量进行了修订)
我们根据客户的要求为客户构建了基于表单的应用程序。在项目接近尾声时,他们决定希望该应用程序能够作为另一个 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 的缺乏经验给我们带来了麻烦。我已经留下了这个问题,以防其他人犯同样的错误。
【问题讨论】:
-
也许只有我一个人,但是将表单加载到面板中似乎很奇怪...winforms中的
Forms在许多其他系统中等同于windows。 -
+1:同意,我不知道为什么它不起作用的细节,但我确信有更好的方法来实现这一点,而无需在面板中嵌入表单。表单通常总是外部容器。
-
+1:我也是。我从来没有考虑过这样的事情。
-
如果您不介意我问,在面板中嵌入表单的基本原理是什么?
-
你所做的在MFC中可能并不奇怪,但在winforms中却是。它们不一样。表单通常具有 [minimize][maximize][close] 以及与 Window 关联的其他内容。 “无论如何,说这很奇怪不是解决方案”......这就是为什么没有人发布答案,只是 cmets :)