zoukankan      html  css  js  c++  java
  • DevExpress 换肤

     在devexpress中,换肤就很简单,不需要我们自己去制造皮肤,官文就有很丰富的皮肤包。下面来讲解一下这个问题。
      注意,我这儿用的是DevExpress 8.1.5,在老版本中可能不支持。如果是7.x的版本,请见demo中的源代码。
      第一步:让所有窗体都从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();

    或者: string skinName = e.Item.Caption; //没测试MDI窗体
    DevExpress.LookAndFeel.UserLookAndFeel.Default.SetSkinStyle(skinName);

      
      现在,大部分的问题都解决了,最后一个问题,怎样在设置皮肤时,将所有已打开的窗口的皮肤都改成对应的样式呢?(在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

  • 相关阅读:
    Oracle数据库(3-7)
    Oracle数据库之PL/SQL程序设计简介
    JAVA总结
    JAVA数据库编程、JAVA XML解析技术
    JAVA网络编程
    【转载】linux启动jmeter,执行./jmeter.sh报错解决方法
    【转载】JMeter学习(十九)JMeter测试MongoDB
    【转载】JMeter学习(二十)JMeter处理Cookie与Session
    【转载】JMeter学习(十八)JMeter测试Java(二)
    【转载】JMeter学习(十七)JMeter测试Java
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/2178174.html
Copyright © 2011-2022 走看看