在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

转载于:https://www.cnblogs.com/MaxWoods/archive/2011/09/16/2178174.html

DevExpress 换肤相关推荐

  1. DevExpress换肤

    procedure TForm1.cxComboBox1PropertiesChange(Sender: TObject); begin// 这个地方必须是UserSkin,不然不会起作用dxSkin ...

  2. devexpress java_DevExpress使用心得一:换肤

    最近要用到界面控件DevExpress.一句话:很好很强大,比起VS自带的winform界面,种类和花样要多了不少.然而,强力的功能带来了庞大的信息量,所以我打算通过一些小模块来和大家一起对它进行探讨 ...

  3. [DevExpress]skin窗体换肤

    转自:http://www.evget.com/article/2014/10/10/21667.html 最近在学习 DevExpress 这个控件,将窗体换肤的一些心得记录下来,分享给大家: [D ...

  4. Devexpress控件使用皮肤,设置默认皮肤及动态换肤

    DevExpress是一个比较有名的界面控件套件,提供了一系列的界面控件套件的DotNet界面控件. 关于皮肤的使用网上可以搜到很多示例,在些做个整理. 1.程序引用 DevExpress.Bonus ...

  5. android view设置按钮颜色_Android 主题换肤技术方案分析

    写在前面 Android TV 电视开发,主题换肤,我感觉有两种层级的方式,一种是 系统级,另一种 是应用级, 我记得很早在 Linux 桌面开发的时候,我们之前的公司在GTK+上也实现了一套换肤UI ...

  6. Swift 换肤方案的实现使用SwiftTheme框架

    SwiftTheme 框架进行换肤 本地创建多个plist文件 设置不同图片颜色数组 飞机票 demo Foundationimport SwiftTheme// 创建一个枚举类型进行换肤 enum ...

  7. Spring Boot一键换肤,so easy!

    SpringMVC 源码分析系列最后一篇,和大家聊一聊 Theme. Theme,就是主题,点一下就给网站更换一个主题,相信大家都用过类似功能,这个其实和前面所说的国际化功能很像,代码其实也很像,今天 ...

  8. 关于如何换肤、子类化的解决方案

    对于应用程序的换肤及子类化.下面是我尝试过一些方法,以在CAboutDlg中子类化其中的Button为例: 第一种:直接用现成的类 1.自己写一个类class CButtonXP : public C ...

  9. vue中利用scss实现整体换肤和字体大小设置

    一.前言 利用Sass预处理实现换肤和字体大小调整. 思路及达到的效果:字体大小的适配使用window.devicePixelRatio的值和需要调整的差量进行控制.页面初始化是的字体适配可以根据de ...

最新文章

  1. 自动驾驶玩漂移,一顿操作猛如虎!!! 斯坦福最新研究
  2. React事件系统整理
  3. Linux文件系统上的特殊权限      SUID, SGID, Sticky(粘之位)
  4. 豆瓣9.8分,周志明的《凤凰架构》,高屋建瓴,推荐(送书)
  5. mfc搜索新建access字段_MFC ODBC类 Access数据库的操作
  6. spring容器bean的作用域 spring容器是否是单例的一些问题
  7. JavaScript 演练(4). 回调函数
  8. html笔记——网页中视频播放,文字滚动
  9. HTML5程序开发范例宝典(韩旭著)读书笔记之渐变背景
  10. python 代码命令大全-Python 命令行参数
  11. 记一次工作中的小坑(关于celery)
  12. 建立RHELAS4下面的Yum本地源
  13. vs 自动生成core dump文件
  14. W ndows7系统的桌面不见了,windows7桌面音量控制键不见了怎么办(图文)
  15. python机器学习之回归预测:电池续航里程问题
  16. 机器学习系列(一)——机器学习简介
  17. HTTP如何保证安全传输
  18. pandas学习笔记之DateFrame
  19. sqlserver位数不够左边补0
  20. 编写程序,用户输入一个列表和2个整数作为下标,然后输出列表中介于2个下标之间的元素组成的子列表。考试题库7

热门文章

  1. 容灾服务器作用,存储容灾服务
  2. rocketmq 消息删除_RocketMQ 实现分布式事务,达到数据最终一致性
  3. 坚果云android功能,坚果云发布Android新版本 离线收藏大增强
  4. oracle授权v$lock,Oracle八大性能视图之v$lock
  5. python struct pack string_python struct pack fmt格式
  6. win10 电脑触摸板不能滑动_用好笔记本的触摸板(win10小技巧)
  7. Android ListView示例教程
  8. Python MySQL示例教程
  9. java 字符串面试_Java字符串面试问答
  10. win10安装应用商店版word(ump版word)