C#实现DevExpress控件换肤功能[vjsdn]改进篇
在写CS框架第2版时遇到换肤问题,最初设计思路是建立一个窗体frmBase,继承XtraForm,在窗体拖放一个DefaultLookAndFeel控件,项目内所有窗体都继承frmBase类。在frmBase_Load事件内设
this.DefaultLookAndFeel.LookAndFeel.SkinName = skinName就可以设置皮肤。然而,这种设计带来一个问题: 当打开一个窗体时加载两次皮肤引起NavBarControl控件闪烁!查看Designer.cs:
private void InitializeComponent()
{
....
this.defaultLookAndFeel1 = new DevExpress.LookAndFeel.DefaultLookAndFeel(this.components);
.....
}
引起闪烁的原因:
窗体构造器调用InitializeComponent()方法,该方法会实例化this.defaultLookAndFeel1 控件。
因this.defaultLookAndFeel1预设SkinName是Caramel, 此时加载Caramel皮肤。接下来执行
frmLoad事件,又加载从用户配置文件读取的SkinName,如皮肤名不同会引起闪烁!
解决方法是:去掉窗体上的defaultLookAndFeel1控件,自己写代码构造defaultLookAndFeel1对象,
通过改进后frmBase窗体代码如下:
代码
public partial class frmBase : XtraForm
{
//定义皮肤控件
public DefaultLookAndFeel DefaultLookAndFeel;
public frmBase()
{
InitializeComponent();
DefaultLookAndFeel = new DefaultLookAndFeel();
}
/// <summary>
/// 设置皮肤
/// </summary>
/// <param name="skinName"></param>
public void LoadSkin(string skinName)
{
this.DefaultLookAndFeel.LookAndFeel.SkinName = skinName;
}
}
通过调用窗体的LoadSkin方法设置皮肤。
本程序类关系图
皮肤名:Caramel
皮肤名:Black
皮肤名:Blue
下载请到原帖:http://www.vjsdn.net/bbs/bbsTopicDetails.aspx?pid=112071224