DevExpress换肤详解
作者:C/S框架网  发布日期:2011/06/26 18:56:16
DevExpress换肤详解

第一步:继承DevExpress.XtraEditors.XtraForm窗体

第二步:添加两个引用:

  DevExpress.BonusSkins.v8.1
  DevExpress.OfficeSkins.v8.1



第三步:在软件的入口Program类的main函数的第一行代码前加上:


DevExpress.UserSkins.BonusSkins.Register();
DevExpress.UserSkins.OfficeSkins.Register();
DevExpress.Skins.SkinManager.EnableFormSkins();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormMain());


第四步:每个窗口放个DefaultLookAndFeel控件,

第五步:软件往往有个设置皮肤的地方,这个地方往往是需要枚举出所有皮肤的,把皮肤全部枚举出来放到一个ComboBoxEdit中,代码如下:

foreach
(DevExpress.Skins.SkinContainer skin in DevExpress.Skins.SkinManager.Default.Skins)
cmbAppStyle.Properties.Items.Add(skin.SkinName);


第六步:设置皮肤,怎样设置皮肤呢,只需设置每个窗口的DefaultLookAndFeel即可,代码如下:


this
.defaultLookAndFeel1.LookAndFeel.SkinName = cmbAppStyle.EditValue.ToString();


现在,大部分的问题都解决了,最后一个问题,怎样在设置皮肤时,将所有已打开的窗口的皮肤都改成对应的样式呢?(在DevExpress8.1.5中, 这个功能自带,但是,并不完全,有缺陷)最基本的方法当然是观察者模式,但是,我想到在winforms中应当有枚举所有已打开窗口的方法。果然,找到 了:Application.OpenForms,再说明一下,为了能统一管理所有窗口的皮肤,我写了个基类,BaseForm,它继承自 DevExpress.XtraEditors.XtraForm。在BaseForm中放个DefaultLookAndFeel。并创建一个公共的属 性DefaultLookAndFeel。然后,在设置皮肤的地方写上:

foreach (Form f in Application.OpenForms)
{
   if (f is TimerApp.Forms.BaseForm)
         (f as TimerApp.Forms.BaseForm).DefaultLookAndFeel.LookAndFeel.SkinName = value;
}
  
但是,这个方法有问题,出错了,说什么“OpenForms集合已变化,无法枚举!”,郁闷。只好用观察者模式了。被观察者的类如下:

using System;
using System.Collections.Generic;
using System.Text;
using TimerApp.Forms;

namespace TimerApp.Utils
{
   
   public class SkinSubject
   {
      private static SkinSubject subject = null;
      
      private List<BaseForm> forms = new List<BaseForm>();
      
      public static SkinSubject GetInstance()
      {
         if (subject == null) subject = new SkinSubject();
         
         return subject; 
      }
      
      private SkinSubject() { }

      /// <summary>
      /// 注册观察者 
      /// </summary> 
      /// <param name="f"></param> 
      public void Register(BaseForm f)
      {
         
         forms.Add(f);
         
      }
      
      
      /// <summary>
      /// 注销观察者 
      /// </summary> 
      /// <param name="f"></param> 
      public void UnRegister(BaseForm f)
      {
         
         forms.Remove(f);
         
      }
      
      /// <summary>
      /// 修改每个观察者的皮肤 
      /// </summary> 
      /// <param name="skinName"></param> 
      public void Notify(string skinName)
      {
         foreach (BaseForm f in forms)
         f.DefaultLookAndFeel.LookAndFeel.SkinName = skinName;
      }
   }
}



这并不是一个标准的观察者模式,它又混合了singon模式,因为被观察者只有一个,且,不需要回调观察者中方法。

注:DevExpress中的默认皮肤名的取得:DevExpress.Skins.SkinManager.DefaultSkinName


上一篇 下一篇