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

时间:2011-11-21 19:24:13

标签: winforms visual-studio visual-studio-2010 windowless

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

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


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

enter image description here

必须 1 Control下降,这是窗口控件的包装。

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

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

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

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

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

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

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

1 或不

1 个答案:

答案 0 :(得分:1)

是和否。

首先,请看看古老的Raymond Chen撰写的这篇文章:http://blogs.msdn.com/b/oldnewthing/archive/2005/02/11/371042.aspx

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

否。对于任何Control派生的控件设计器(例如将它们放在Panel或Form上),Windows窗体设计器不支持任何无窗口控件不会有拖放式表单设计。

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

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

  1. 创建一个派生自Component的类,用于管理Windowless控件。例如,您可以调用此类WindowlessWidgetManager。编译后,此控件将在您的工具箱中。 WindowlessWidgetManager可以包含无窗口控件的集合,并为画布提供绘画和其他UI支持,例如FormPictureBox
  2. 创建一个派生自ComponentDesigner的设计器类,该类支持在设计时添加和删除自定义控件等内容。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.componentmodel.design.componentdesigner(v=VS.90).aspx
  3. 这是一个非常冗长的过程,有许多警告,但如果这是您希望实现的,那么功能就在那里。