为软件换肤,是一个永恒的主题,winforms换肤,现在b/s也换肤。呵呵。
在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();
现在,大部分的问题都解决了,最后一个问题,怎样在设置皮肤时,将所有已打开的窗口的皮肤都改成对应的样式呢?(在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
一步一步教你学界面换肤。
原创
©著作权归作者所有:来自51CTO博客作者致简致优的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:从C#程序中调用非受管DLLs
下一篇:抽象类和接口的区别
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
一步一步教你写kubernetes sidecar
边车模式通过给应用服务加装一个“边车”来达到控制和逻辑的分离的目的。
scala HTTP kubernetes 边车模式 -
一步一步教你搭建Hadoop分布式集群
旨在说明如何部署hadoop伪分布式集群和完全分布式集群
hadoop vim Hadoop -
一步一步教你安装vnc
vnc 配置vnc远程桌面连接:1. 在命令行输入init 3,进入纯字符界面2. kill掉所有与X有关的进程用命令
配置 远程桌面 vnc 休闲 237654601 -
一步一步教你SSM整合swagger
SSM整合swagger
SSM整合 swagger -
一步一步教你如何搭建LAMP
仔细看清代码再写不然会报错
centos mysql php -
一步一步教你写kubernetes sidecar
边车模式通过给应用服务加装一个“边车”来达到控制和逻辑的分离的目的。
scala HTTP kubernetes 边车模式 -
一步一步教你YAML快速入门
一步一步教你YAML快速入门
一步一步教你YAML快速入门 -
一步一步教你部署hexo博客网站
一步一步教你部署hexo网站
json git html github nginx -
DM or不走索引
为了提高数据查询效率,就像目录一样的存在!在MySQL中,索引是在存储引擎层实现的,所以并没有统一的索引标准,不同的存储引擎的索引工作方式并不一样。 常见模型 哈希表:  
DM or不走索引 java 数据结构 数据库架构 字段