【问题标题】:The role of BeginInit() and EndInit() methods in DesignerBeginInit() 和 EndInit() 方法在 Designer 中的作用
【发布时间】:2015-05-26 15:27:29
【问题描述】:

我知道 ISupportInitialize 接口的那些方法被 Designer 用来支持优化,确保控件初始化的原子性,并防止在初始化期间对控件进行任何操作。我的问题是:

  1. 它们以何种方式帮助 Designer 优化控件的初始化?
  2. 为什么要保证初始化的原子性?
  3. 在不是由 Designer 生成的代码中使用它们时是否有任何合理的示例?

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    它与优化无关。 ISupportInitialize 是当您的控件对分配属性的顺序敏感时需要的接口。没有任何方法可以影响设计师分配它们的顺序,它是按字母顺序进行的。

    您通常在 BeginInit() 方法中将 bool 变量设置为 true,然后在属性设置器中对其进行测试,并且在设置时不执行任何操作。然后您的 EndInit() 方法使属性值生效。

    您可以在ErrorProvider component 中看到一个很好的例子。请注意它如何使用这些方法来延迟数据绑定。 PictureBox control 是另一个很好的例子,它使用它来延迟图像下载。 TrackBar 是另一个示例,它使用它来确保Value 属性介于最小值和最大值之间。等等,.NET Framework 源代码通常是了解 .NET 类型在实践中如何使用的好地方。

    【讨论】:

    • 所以您是说BeginInit()EndInit() 在Designer 中按字母顺序排列属性?属性的顺序如何影响控件?
    • 不,你错过了那一英里。不知道如何更好地解释它或提供更多使用示例。把它放在架子上,你迟早会发现为什么需要它。
    • 基本上,如果您的控件无法处理以任意(字母顺序)顺序设置的属性,或者需要知道所有属性何时完成设置,你就是这样做的。
    【解决方案2】:

    根据定义,设计器允许在可视模式下创建控件,然后由 Visual Studio 生成用于初始化控件的适当代码。

    初始化在一个地方完成,以避免稍后在您的代码中出现任何空引用问题。当您使用它们的引用时,您确实希望每个控件都已经创建。

    例如,如果您想基于特定的构造函数动态创建界面,您可以完美地创建控件初始化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-27
      • 2019-03-20
      • 1970-01-01
      • 2021-12-11
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多