5

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

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


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

在此处输入图像描述

must 1 descend from Control,它是一个窗口控件的包装器。

不幸的是,窗口控件非常“重”;有很多,尤其是嵌套的,会导致 WinForms 中的性能受到影响。

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

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

这些对于缓解 WinForms 中的性能问题很有用,但它们被困在代码中。

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

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

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

1与否

4

1 回答 1

1

是和否。

首先,看看陈瑞峰的这篇文章:http: //blogs.msdn.com/b/oldnewthing/archive/2005/02/11/371042.aspx

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

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

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

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

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

这是一个非常漫长的过程,有许多警告,但如果这是您希望实现的,那么功能就在那里。

于 2011-11-29T23:21:25.623 回答