Ser*_*ier 4 designer visual-studio-2008 windows-forms-designer winforms
我正在开发自己的WinForms设计器.它必须能够加载现有的自定义表单类型.我遇到的一个问题是没有默认ctor的表单:我的代码当前在将表单加载到设计器之前实例化表单,这需要默认的ctor.
OTOH,VS2008能够加载这样的表格.我相信它实际上并没有实例化我的表单(如本问题所述):即使默认ctors也没有执行.它并不真正执行InitializeComponent().我刚刚在该函数中添加了一个消息框,但它没有显示.
看起来它动态地模仿自定义表单类型,并且只执行它认为相关的InitializeComponent中的部分代码.
有谁知道我在哪里可以找到有关VS设计师如何工作的更多信息.
TIA.
注意:我发现这个相关的问题没有满足答案
编辑:附加信息:史蒂夫指向我CodeDom,这是非常有趣的.我的问题是,我需要加载到我的设计器中的类型已经编译而不是作为源代码提供.我找不到任何方法将CodeDom反序列化应用于编译代码.
Ste*_*nan 13
在这里找到:
在VS中打开新的Windows应用程序项目时,您会在设计视图中看到一个名为Form1的空表单.现在,您尚未构建项目,那么设计人员如何能够创建Form1的实例并显示它?好吧,设计师根本没有真正实例化Form1.它正在创建Form1基类的实例,即System.Windows.Forms.Form.有了面向对象编程的基本知识,你会发现这在直觉上是有意义的.在设计Form1时,首先要使用基类Form,然后对其进行自定义.这正是设计师帮助您做的事情.
现在让我们假设你向Form添加了一堆控件并关闭了设计器.当您重新打开设计器时,控件仍然存在.但是,基类Form上没有这些控件,因此如果设计器没有运行Form1的构造函数,它是如何显示控件的?设计者通过反序列化InitializeComponent中的代码来完成此操作.设计人员支持的每种语言都有一个CodeDomProvider,它负责提供解析器,解析InitializeComponent中的代码并创建它的CodeDom表示.然后,设计器调用一组CodeDomSerializers将其反序列化为可以添加到设计时Form的实际控件(或更广泛的组件).现在,我已经掩盖了该描述中的许多细节,但这里的重点是Form1的构造函数和InitializeComponent永远不会被真正调用.相反,设计器解析InitializeComponent中的语句,以确定要实例化和添加到表单的控件.
以上是Visual Studio中的Windows窗体设计器加载表单的方式.如果你正在寻找的是创造一个没有默认构造函数形式的实例的方式,并仍然可以访问包含的组件/控制,我不知道一个解决方案.我所知道的唯一一个允许你绕过缺少默认构造函数的方法是FormatterServices.GetUninitializedObject,但要注意......
因为对象的新实例初始化为零并且没有运行构造函数,所以该对象可能不表示该对象认为有效的状态.
我也有一个应用程序,需要实例化编译的表单,但总是使用Activator.CreateInstance,并且要求其他开发人员至少包含一个私有默认构造函数,如果他们希望在我的应用程序中访问它们的表单.由于我们拥有整个代码库,每个人都知道这个要求,这不是问题,对我们来说效果很好.
归档时间: |
|
查看次数: |
1790 次 |
最近记录: |