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 或不
答案 0 :(得分:1)
首先,请看看古老的Raymond Chen撰写的这篇文章:http://blogs.msdn.com/b/oldnewthing/archive/2005/02/11/371042.aspx
是。我们欢迎您创建不是源自Control
的“控件”。我在我的应用程序中创建了几个无窗口控件,本机支持单击,分层等,我将它们绘制到屏幕外缓冲区,然后直接在父Form
或Control
上绘制它们(例如PictureBox
)。这很简单,但并不简单,因为您需要自己在代码中管理所有内容。
否。对于任何Control
派生的控件设计器(例如将它们放在Panel或Form上),Windows窗体设计器不支持任何无窗口控件不会有拖放式表单设计。
汉斯指出,ToolStrip
和MenuStrip
(无窗口控制)就是这样的例子。请注意,当您在MenuStrip
上创建新的Form
时,MenuStrip
会放置在表单下方的组件托盘中。 MenuStrip
有一组与之关联的自定义Designer类,以支持自定义绘制和“在此处键入”功能,以及用于添加和删除菜单项的对话框。请注意,“子”无窗口控件(例如ToolStripButton
)在ToolBox中不可用于直接在表单上进行拖放支持 - 只有自定义设计器知道它。 MenuStrip
的自定义设计器还支持选择子窗口控件,以便您可以在“属性”窗口中编辑每个项目的属性。
我无法想象这适合您的情况(除非您要为转售创建一些控件),但如果您非常坚定,您可以以同样的方式创建设计器支持你的无窗口控件:
Component
的类,用于管理Windowless控件。例如,您可以调用此类WindowlessWidgetManager
。编译后,此控件将在您的工具箱中。 WindowlessWidgetManager可以包含无窗口控件的集合,并为画布提供绘画和其他UI支持,例如Form
或PictureBox
。ComponentDesigner
的设计器类,该类支持在设计时添加和删除自定义控件等内容。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.componentmodel.design.componentdesigner(v=VS.90).aspx 这是一个非常冗长的过程,有许多警告,但如果这是您希望实现的,那么功能就在那里。