Visual Studio WinForms是否支持无窗口控件?

Ian*_*oyd 5 visual-studio-2010 windowless visual-studio winforms

Visual Studio WinForms工具箱中的每个控件都必须来自Control

Visual Studio是否支持无窗口控件?


您在Visual Studio中添加到工具箱的每个控件:

在此输入图像描述

必须1来自Control,这是一个窗口控件周围的包装.

不幸的是,Windowed控件非常"重"; 拥有很多它们,特别是嵌套,会导致WinForms的性能受损.

在过去,我通过创建聚合自定义控件来解决问题.自定义控件内部包含其他无窗口控件:

  • 图像(无窗口版本PictureBox)
  • 标题标签(无窗口版本Label)
  • 字幕标签(无窗口版本Label)
  • 边框(无窗口版本Panel)

这些对于缓解WinForms中的性能问题非常有用,但它们仍然存在于代码中.

我想做其他开发环境允许的,是一个Control不创建Windows窗口的版本.我希望Visual Studio工具箱能够接受**无窗*控件.

我知道如果我真的想要无窗口控件:我应该切换到WPF.但这太过分了.

Visual Studio WinForms是否支持无窗口控件?

1或不

Kev*_*ick 1

是和否。

首先,请查看可敬的 Raymond Chen 的这篇文章: http://blogs.msdn.com/b/oldnewthing/archive/2005/02/11/371042.aspx

是的。 欢迎您创建不派生自 的“控件” Control。我在我的应用程序中创建了几个本机支持单击、分层等的无窗口控件,我将它们绘制到屏幕外缓冲区,然后将它们直接绘制在某些父级FormControl(例如PictureBox)上。这很简单,但并不简单,因为您需要自己用代码管理一切。

不可以。 对于任何派生控件设计器Control(例如将它们放置在面板或窗体上),Windows 窗体设计器中将不支持任何无窗口控件,因此您将无法进行拖放窗体设计。

正如汉斯所指出的,ToolStripMenuStrip(无窗口控件)就是这样的例子。MenuStrip请注意,当您在 a 上创建新组件时Form, 会MenuStrip被放置在表单下方的组件托盘中。它MenuStrip有一组与其关联的自定义设计器类,以支持自定义绘制和“在此处键入”功能,以及用于添加和删除菜单项的对话框。请注意,“子”无窗口控件(例如 )ToolStripButton在工具箱中不提供直接拖放到窗体上的支持 - 只有自定义设计器知道这一点。自定义设计器MenuStrip还支持选择子无窗口控件,以便您可以在“属性”窗口中编辑每个项目的属性。

我无法想象这适合您的情况(除非您正在创建一些用于转售的控件),但如果您非常坚定,您可以以几乎相同的方式为您的一组无窗口控件创建设计器支持:

  1. 创建一个派生类,该类Component将用于管理您的无窗口控件。例如,您可以将此类称为WindowlessWidgetManager. 编译后,该控件将位于您的工具箱中。WindowlessWidgetManager 可以包含无窗口控件的集合,并为画布(例如 或 )提供绘画和其他 UIForm支持PictureBox
  2. 创建一个派生自的设计器类,ComponentDesigner支持在设计时添加和删除自定义控件等操作。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.componentmodel.design.componentdesigner(v=VS.90).aspx

这是一个非常漫长的过程,有很多注意事项,但如果这是您希望实现的目标,那么该功能就在那里。