DevExpress换肤详解
第二步:添加两个引用:
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;
}
{
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;
}
}
}
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
参考文档:
使用DeepSeek生成DevExpress表格、窗体、C#模型代码并集成到开发框架|C/S开发框架
详解DevExpress.LookUpEdit控件实现自动搜索定位功能|C/S开发框架
DevExpress LookupEdit按回车键自动确认选择数据|C/S开发框架
DevExpress GridControl显示主从表数据(Master/Detail)|C/S开发框架
VS2022+.NET 部署DevExpress V23.2|C/S开发框架
DevExpress组件版本下载、安装与VS开发环境 | Winform C/S框架|C/S开发框架
CSFrameworkV6开发框架升级VS2022+.NET8+DevExpress24.1操作步骤|C/S开发框架
C/S结构快速开发框架使用的DevExpress常用组件|C/S开发框架
DevExpress XtraReport 开发指南|单表报表设计详解(C#)|C/S开发框架
DevExpress 表格显示分组小计与总计(GroupSummary)
C# DevExpress高级篇 | GridLookUpEdit组件使用|C/S开发框架
VS2022解决方案部署DevExpress组件(DevExpress Project Settings)|C/S开发框架
C# DevExpress教学 GridLookUpEdit组件表格下拉组件使用|C/S开发框架
踩坑日记 | DevExpress GridView.GetSelectedRows方法返回无效的RowHandle行号|C/S开发框架
DevExpress常用组件操作扩展类:DevExpressExtensions.cs|C/S开发框架
喜鹊ERP | DevExpress 表格常用操作指南|表格组件自动分组|C/S开发框架
使用DeepSeek生成DevExpress表格、窗体、C#模型代码并集成到开发框架|C/S开发框架
详解DevExpress.LookUpEdit控件实现自动搜索定位功能|C/S开发框架
DevExpress LookupEdit按回车键自动确认选择数据|C/S开发框架
DevExpress GridControl显示主从表数据(Master/Detail)|C/S开发框架
VS2022+.NET 部署DevExpress V23.2|C/S开发框架
DevExpress组件版本下载、安装与VS开发环境 | Winform C/S框架|C/S开发框架
CSFrameworkV6开发框架升级VS2022+.NET8+DevExpress24.1操作步骤|C/S开发框架
C/S结构快速开发框架使用的DevExpress常用组件|C/S开发框架
DevExpress XtraReport 开发指南|单表报表设计详解(C#)|C/S开发框架
DevExpress 表格显示分组小计与总计(GroupSummary)
C# DevExpress高级篇 | GridLookUpEdit组件使用|C/S开发框架
VS2022解决方案部署DevExpress组件(DevExpress Project Settings)|C/S开发框架
C# DevExpress教学 GridLookUpEdit组件表格下拉组件使用|C/S开发框架
踩坑日记 | DevExpress GridView.GetSelectedRows方法返回无效的RowHandle行号|C/S开发框架
DevExpress常用组件操作扩展类:DevExpressExtensions.cs|C/S开发框架
喜鹊ERP | DevExpress 表格常用操作指南|表格组件自动分组|C/S开发框架
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
