代码之家  ›  专栏  ›  技术社区  ›  Serge Wautier

Winforms设计器如何实例化我的表单?

  •  5
  • Serge Wautier  · 技术社区  · 17 年前

    我正在开发自己的WinForms设计器。它必须能够加载现有的自定义表单类型。我遇到的一个问题是没有默认ctor的表单:我的代码目前在将表单加载到设计器之前对其进行实例化,这需要一个默认的ctor。

    this question

    它看起来像是动态地模仿自定义表单类型,只执行InitializeComponent中它认为相关的部分代码。

    注意:我找到了这个 related question

    编辑:附加信息:Steve向我推荐了CodeDom,这非常令人反感。不过,我的问题是,我需要加载到设计器中的类型已经编译好了,而不是作为源代码提供。我找不到任何方法将CodeDom反序列化应用于编译后的代码。

    2 回复  |  直到 9 年前
        1
  •  13
  •   Steve Dignan    17 年前

    here :

    设计中称为Form1的空表单 视图。现在,你还没有建造 项目还没有完成,设计师怎么样了 能够创建Form1的实例 实际上是在实例化Form1。它 形式1的类别。, 编程,你会发现这 设计Form1时,您可以从 基类、窗体,并对其进行自定义。 这正是设计师所做的 帮助你做。

    设计师,控件仍然 在那里。然而,基类形式 如果设计师没有运行 Form1的构造函数,它是如何显示的 设计者所支持的具有 负责的CodeDomProvider 用于提供解析 设计时的形式。现在,我已经解释过了 里面有很多细节 Form1的构造器和 InitializeComponent从未真正 调用。相反,设计师解析 InitializeComponent中的语句 找出控制措施


    以上是Visual Studio中的Windows窗体设计器加载窗体的方式。如果您正在寻找的是一种创建没有默认构造函数的窗体实例的方法 仍然可以访问包含的组件/控件,我不知道有什么解决方案。据我所知,唯一能让你绕过默认构造函数缺失的方法是 FormatterServices.GetUninitializedObject

    Activator.CreateInstance 并要求其他开发人员至少包含一个私有默认构造函数,如果他们想在我的应用程序中访问他们的表单。由于我们拥有整个代码库,并且每个人都知道这一要求,因此这不是问题,对我们来说效果很好。

        2
  •  0
  •   Andy    17 年前