开始上手DevExpress控件开发。
但是个人感觉这套控件虽然相当豪华,但是很难上手,资料少不说,其属性设置什么的与通常的属性差别太大,应用起来太难。相比dotNetBar要好很多,比如改造现有窗体只需要改变按钮类型以及窗体父类就可以了,但是对于DevExpress这简直是天方夜谭。研究整整两天到现在才有关于窗体皮肤的那么一点头绪,真郁闷。
在DevExpress中有些内建的风格了,要加载额外的风格,需要使用 DevExpress.Skins.SkinManager.Default.RegisterAssembly 这个方法,下面是示例代码:
DevExpress.Skins.SkinManager.Default.RegisterAssembly(System.Reflection.Assembly.Load("Office2007Bonus"));
//DevExpress.Skins.SkinManager.Default.RegisterAssembly(System.Reflection.Assembly.Load("DevExpress.XmasSkins"));
DevExpress.Skins.SkinManager.Default.RegisterAssembly(System.Reflection.Assembly.Load("DevExpress.OfficeSkins.v7.3"));
上面那行注释掉的是因为运行会出错,个人估计是因为破解的缘故,呃。这样加载的结果,大概是有17个风格出现。
在风格加载过后,通过 DevExpress.Skins.SkinManager.Default.Skins 可以获得所有皮肤的列表。
在应用控件后,窗体要应用DevExpress的风格,可以让窗体不从 System.Windows.Forms.Form 继承而从 DevExpress.XtraEditors.XtraForm 继承,这样窗体就可以使用DevExpress 的风格颜色配置了。但是这样使用后还会有问题,就是窗体的边框不会被DevExpress的风格应用上。
要解决这个问题,可以使用 DevExpress.Skins.SkinManager.EnableFormSkins() 这个方法,在应用后,窗体边框也会被应用上风格。这个方法建议在创建窗体前就调用,比如在 Program.cs 的Main方法中,在 Application.Run 调用前就使用,这样能避免很多问题。
到此基本上达到目的了,但是呢,人类的欲望是无穷的啊。现在就会发现有点不爽的地方了,是什么呢?就是当一个窗体是MDI窗体(MDIParent不为空)的时候,这个窗体是无论如何也无法被应用的。郁闷不?那当然郁闷,何止是郁闷,那不是一般的郁闷啊。可怜DevExpress的开发文档少得就如同我兜里的钞票一样,在它的Demo之内也没有找到示例。
基本上花了三个小时折腾到现在就是为了折腾这个。唉。
不过终于找到方法了,还是从开发文档中找到的,那就是 evExpress.Skins.SkinManager.EnableMdiFormSkins() 这个方法。望文生义,看这个方法的名字就知道这个函数是干嘛了吧??
但是很让我感觉不对劲的是,为什么在VS里面找不到这个方法。在SDK中对这个方法的解释是,“This member supports the internal infrastructure and is not intended to be used directly from your code”。我英语不太好,但是我看懂了它是在说不建议直接从代码中调用,也不知道是为什么。祭出伟大的 Reflector 反编译一下 DevExpress.Utils.v7.3.dll ,看到这样的代码:
3{
4 allowMdiFormSkins = true;
5}
原来如此,根据方法属性不让浏览到,不明白DevExpress这样处心积虑去隐藏是为什么,难道见不得人吗
琢磨着可能有其它的方法能间接调用,但是折腾这么久死了N+脑细胞也没能找到是因为什么啊,忧郁
算了,最后就直接调用了,编译正常,运行也正常。想不通,但就这么着吧。最后Program.cs中的代码如下:
{
Application.EnableVisualStyles();
DevExpress.UserSkins.OfficeSkins.Register();
DevExpress.Skins.SkinManager.EnableFormSkins();
DevExpress.Skins.SkinManager.EnableMdiFormSkins();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
任务达成,撤退!
dev学习资料太少了,需要自己一点点去啃
汉字