xiang.zhiwei®

其实,我们都是无知的,只是无知的方面不同而已。

   :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

由于工作中自己开发的工作流产品中需要一个用户能够自定义WebForm的表单设计器,在我接手这个项目之前的东西,有一个很难用的东西,我觉得用起来很不方便,技术性太强,操作性太差,如果给用户使用的话,那就更加困难了。(幸运的是,产品的用户就是自己公司的员工,自己开发自己用,所以开发时间上相对不是很紧张,功能做得不好可以一步一步地完善的。),所以我尝试制作一个类似 ASP.NET Web MatrixWebForm设计器,可是,却发现相关的资料却相当的匮乏。

 

后来,在MSDN的网站上找到这个,一个Windows From 的设计器(通过用 .NET 生成自定义窗体设计器(Windows Form Designer Hosting)来定制应用程,终于知道了自己做一个设计器宿主的步骤和一些必备的知识了。MSDN上的设计器宿主示例程序(CustomFormsDesigner.exe)

 

最初,由于对Designer Hosting缺乏认识,以为把上面提到的文章读懂了就可以照着做一个Web Form的设计器。可以深入的学习之后,才知道两者有着巨大的区别,Windows Form的设计器时基于GDI+的,实现了IRootDesignerIDesignerHost, ISelectionService...一系列的接口后,调用IRootDesigner.GetView()获取一个视图对象,添加到Windows Form中的控件中就可以实现设计界面,然而,IRootDesigner.GetView()获取到的View只有对WindowsForm的支持,没有对WebFrom的支持。到这时,以我的认识,要做一个WebForm设计器,基本上觉得无能为力了。

 

一个意外的发现,在blogs.msdn.com 上,我发现一篇文章Designer Hosting in Whidbey,当时的第一反应就是可能在.NET 2.0中,有对WebForm的设计支持。果然,我发现在System.Designe.dll中的System.Web.UI.Designe,下面一个叫WebFormsRootDesigner的类引起了我的注意。不过它却是一个抽象类,关于最重要的GetView()方法根本就没有实现,或许,这是给以后扩充留着的吧,还是没有找到实现的方法,只有继续郁闷了。

 

ASP.NET Web Matrix 也曾是我研究的对象,不过,可能是我水平还差得远吧,没有看出什么结果,不过,通过Spy++ 我看到了它是使用的 IE WebControl, ForntPage, Visual Studio.NET也一样,最终,我想,应该在这上面做文章的时候了。

 

IE WebControl 5.5中所有的可视的Tag都有个ContentEditable属性,不是么?解决办法大概就是它了,首先还是实现设计器必须的一系列接口,用于获得组件的设计时支持,可以获取组件的设计器的GetDesignTimeHtml()方法就可以了,不需使用IRootDesigner .GetView()。现在,我的大概想法是,用标准的XHTML格式来生成ASPX页面,以方便解析成HTML DOM,遇到服务器控件(<xxx:xxx runat=”Server”></xxx:xxx>格式的标签),就通过它的Attirbute尝试找它的Designer,有的话,就调用设计器的GetDesignTimeHtml()方法,没有?直接接调用组件的RenderContents()方法,将获取到的组件的HTML包装一下,用<div ContentEditable=”true” id=”dvi_组件的ID”>组件的HTML</div>的形式 来代替 <xxx:xxx runat=”Server”></xxx:xxx> 这段文本间最终的整个页面的HTML呈现在 IE WebControl中,基本上就可以达到设计时支持的效果了。

 

不过,获取组件的设计时HTMLGetDesignTimeHtml())却还没有实践过,仅仅知道RenderContents()方法是可行的,有待于进一步的实践。现在需要解决的问题除了这个之外,就是实现怎样获取组件设计时的Verb支持了,应该只是直接调用组件设计器的DesignerVerbCollection吧。

剩下的,就等待用实践去检验吧。

posted on 2005-07-25 20:57  xiang.zhiwei  阅读(2601)  评论(10编辑  收藏  举报