本鱼拟成立工作室承接项目开发/软件定制/云设施开发运维/办公设备技术支持等,如您有相关需求,欢迎来询 | ::博客文章推荐::

DevExpress窗体风格应用以及MDI子窗体风格的应用

: DOT.NET 木魚 6795℃ 2评论

开始上手DevExpress控件开发。

 但是个人感觉这套控件虽然相当豪华,但是很难上手,资料少不说,其属性设置什么的与通常的属性差别太大,应用起来太难。相比dotNetBar要好很多,比如改造现有窗体只需要改变按钮类型以及窗体父类就可以了,但是对于DevExpress这简直是天方夜谭。研究整整两天到现在才有关于窗体皮肤的那么一点头绪,真郁闷。

在DevExpress中有些内建的风格了,要加载额外的风格,需要使用 DevExpress.Skins.SkinManager.Default.RegisterAssembly 这个方法,下面是示例代码:

DevExpress.Skins.SkinManager.Default.RegisterAssembly(System.Reflection.Assembly.Load("DevExpress.BonusSkins.v7.3"));
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 ,看到这样的代码:

1[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 2public static void EnableMdiFormSkins()
3{
4    allowMdiFormSkins = true;
5}

原来如此,根据方法属性不让浏览到,不明白DevExpress这样处心积虑去隐藏是为什么,难道见不得人吗

琢磨着可能有其它的方法能间接调用,但是折腾这么久死了N+脑细胞也没能找到是因为什么啊,忧郁
算了,最后就直接调用了,编译正常,运行也正常。想不通,但就这么着吧。最后Program.cs中的代码如下:

[STAThread] static void Main()
{
Application.EnableVisualStyles();
DevExpress.UserSkins.OfficeSkins.Register();
DevExpress.Skins.SkinManager.EnableFormSkins();
DevExpress.Skins.SkinManager.EnableMdiFormSkins();
Application.SetCompatibleTextRenderingDefault(
false);
Application.Run(
new MainForm());
}

任务达成,撤退!

喜欢 (1)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(2)个小伙伴在吐槽
  1. dev学习资料太少了,需要自己一点点去啃

    why2024-05-31 19:15 回复
  2. 0151.gif汉字

    那个同学2015-05-05 09:15 回复