【问题标题】:Winforms - Embedding form inside a form or container causes form controls to behave differentlyWinforms - 在表单或容器中嵌入表单会导致表单控件的行为不同
【发布时间】: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 :)

标签: .net winforms


【解决方案1】:

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

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

【讨论】:

  • 我已经设计了所有的表单,然后客户要求我不显示新的对话框,而是将其加载到内容区域,所以我走了这条路。我想最好将所有表单都转换为控件?
  • 我不知道您要处理多少表格或它们的复杂程度,但您至少可以考虑通过采用最简单的表格并将其转换为 UC 来测试这一点。
  • 完成。将其中一个转换为控件解决了该问题。谢谢你的建议。是时候转换了... :)
【解决方案2】:

从您发布的内容来看,您想动态加载一些 ui 元素并仅在全部加载完成后才显示它们?我通常会使用“面板”或用户控件来完成

[不编译测试代码]

Panel p = new Panel();
p.TopLevel = false;
p.Dock = DockStyle.Fill;
p.Controls.Add( button );
// etc
Controls.Clear();
Controls.Add(p);

【讨论】:

  • 谢谢。我想我应该首先使用用户控件而不是表单。当客户要求将表单放入内容区域时,我已经对表单进行了编码,因此我采用了我想到的第一条路线。我不是 WinForms 大师,这是我第一次在 WinForms 中尝试这个,尽管我仍然不明白这种行为的原因。其他方面的表格功能很好。
  • @mrjoltcola 哎哟......希望表格不要太多。您也许可以从 *.designer.cs 文件中复制大部分代码
  • +1 感谢您的建议。将表单转换为控件似乎是现在最好的途径。
【解决方案3】:

总之,你想要的都是可能的,看看这里:

http://social.msdn.microsoft.com/Forums/en/winforms/thread/a5a5ace5-2f88-4ed3-b1e5-ec3500ce1df1

只需导入 SetParent 并使用它。会有一些开销——你必须处理子位置的大小和位置——但在大多数情况下并没有太大的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多