为啥要从设计器中插入非 UI Windows.Forms 组件?
Posted
技术标签:
【中文标题】为啥要从设计器中插入非 UI Windows.Forms 组件?【英文标题】:Why should I insert a non-UI Windows.Forms component from the designer?为什么要从设计器中插入非 UI Windows.Forms 组件? 【发布时间】:2015-12-24 09:10:38 【问题描述】:在 C#(和 Visual Basic)中,您可以直接从表单设计器添加几个非 UI 组件(不继承自 System.Windows.Forms.Control
的组件)。这些组件的示例是System.Windows.Forms.FolderBrowserDialog
和System.Windows.Forms.Timer
。
但是,使用 UI 设计器添加非 UI 控件而不是直接从代码中实例化它们有什么好处?这背后有什么理由吗?
【问题讨论】:
InitializeComponent() 有你刚刚删除的东西的代码,如果我理解正确的话 @brykneval 我知道设计器在哪里声明和初始化组件,但我不明白将设计器用于非 UI 组件的好处。 您可以检查是否实现了IDisposable
的对象,设计者是否在Disposing(bool disposing)
中添加了Dispose()
调用。或者查找变量名上的所有引用,看看是否添加了任何代码(除了显而易见的)。
【参考方案1】:
如果您不需要设计时支持,并且您自己会负责编写标准代码来初始化和处理组件,那么您不需要将组件放在设计器上。
在设计器中使用非 UI 组件有以下好处:
设计时支持 标准代码(用于初始化和处理)设计时支持
Windows 窗体中最强大的功能之一是能够使用设计器设置组件属性。
尽管Timer
不是 UI 组件,但您可以在设计时设置其属性,例如间隔。这适用于许多其他组件,例如 BindingSource
、ErrorProvider
等,您可以使用非常友好的属性网格和类型编辑器以及类型转换器在设计时配置属性。
BindingSource
,它使数据绑定变得非常容易。
当您需要使用像HelpProvider
和Tooltip
这样的扩展提供程序时,由于它们与其他控件相关,因此在设计模式下配置它们非常容易。
当您需要配置DataSource
和DataMember
等属性时,使用设计器非常友好,并使用了出色的属性网格功能。
组件将添加为类级别字段,您可以使用 deigner 将它们公开。
当您需要为您的组件使用Form
的Localizable
功能时,使用设计器完全可用。
当您需要简单地添加或删除事件处理程序时,您可以使用属性网格来完成。
标准代码
如果您查看设计器生成的代码,您会看到:
为支持ISupportInitialize
的组件生成的代码使用它们的BeginInit
和EndInit
为组件生成代码,将this.components
传递给构造函数,然后在Dispose
时使用
如果您不需要设计时支持并且您为组件编写标准代码,那么在代码中使用主题是完全可以的。
【讨论】:
以上是关于为啥要从设计器中插入非 UI Windows.Forms 组件?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在设计查看器中的字体在 Android Studio 中是模糊的?
在 ORM 设计器中,为啥服务器对象不能通过新的更改正确刷新?