.net之Winforms之在窗体或容器中嵌入窗体会导致窗体控件的行为不同

daizhj 阅读:92 2024-11-24 20:56:43 评论:0

(针对内容质量进行了修订)

我们根据客户的要求构建了基于表单的应用程序。在项目快结束时,他们决定希望该应用程序以需要将屏幕包含在更大的表单中的方式作为另一个 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 缺乏经验让我们陷入了麻烦;我留下了这个问题,以防其他人犯同样的错误。

请您参考如下方法:

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

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


标签:程序员
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号