为什么要从设计器中插入一个非 UI Windows.Forms 的组件?

Why should I insert a non-UI Windows.Forms component from the designer?

在 C#(和 Visual Basic)中,您可以直接从窗体设计器添加几个非 UI 组件(那些不继承自 System.Windows.Forms.Control 的组件)。这些组件的示例是 System.Windows.Forms.FolderBrowserDialogSystem.Windows.Forms.Timer.

但是使用 UI 设计器添加非 UI 控件而不是直接从代码实例化它们有什么好处?这背后有什么道理吗?

如果您不需要设计时支持,并且您自己会负责编写标准代码来初始化和处置组件,那么您不需要将组件放在设计器上。

在设计器中使用非 UI 组件有以下好处:

  • 设计时支持
  • 标准代码(用于初始化和处置)

设计时支持

windows 表单中最强大的功能之一是能够使用设计器设置组件属性。

尽管 Timer 不是 UI 组件,但您可以在设计时设置其属性,如间隔。这适用于许多其他组件,如 BindingSourceErrorProvider 等,您可以使用非常友好的 属性 网格和类型编辑器以及类型转换器在设计时配置属性。

  • 当你想为其他控件配置依赖属性时;例如通过在设计器中添加BindingSource,它使数据绑定变得非常容易。
  • 当您需要使用像HelpProviderTooltip这样的扩展器提供程序时,由于它们与其他控件相关,因此在设计模式下配置它们非常容易。
  • 当你需要配置像DataSourceDataMember这样的属性时,使用设计器非常友好,使用很棒的属性网格功能。
  • 组件将添加为 class 级别字段,您可以使用 deigner 使它们 public。
  • 当您需要为组件使用 FormLocalizable 功能时,使用设计器完全可用。
  • 当您需要简单地添加或删除事件处理程序时,您可以使用 属性 网格来完成。

标准代码

如果您查看设计器生成的代码,您会看到:

  • 为支持 ISupportInitialize 的组件生成的代码使用它们的 BeginInitEndInit
  • 为组件生成代码,将this.components传递给构造函数,然后在Dispose
  • 时使用它

如果你不需要设计时支持,并且你为组件编写了标准代码,那么在代码中使用主题是完全可以的。