C# Winform换肤 For vs2005
关于c# winform中的换肤技术,并不是了解很多,今天在网上看到一个简单的方法,只要一个控件和几个皮肤文件就可以,下面我把步骤贴出来与大家共享。
IrisSkin2控件(破解版,只限Microsoft Visual Studio 2005)和皮肤下载地址如下:
http://www.zixi.net/file/skin.rar
demo程序,含源文件。
http://www.zixi.net/file/skindemo.rar
下载控件后解压有一个IrisSkin2.dll和一个skin文件夹。
把IrisSkin2.dll添加到你的项目引用里;
接着在解决方案管理器里右击项目->添加->新建文件夹,文件夹名字:skin;
然后在skin文件夹上右键→添加→现有项,弹出文件选择框里找到解压出来的skin文件夹里所有*.ssk文件添加进去;
这时候就可以看到skin文件夹里已经出现了我们刚刚添加的*.ssk文件了,然后全部选择这些*.ssk文件,切换到属性栏,在属性栏里面可以看到“生成操作”一栏,默认选项是“无”,修改成“嵌入的资源”;
添加一个新建类SkinClass,把以下的代码复制进去,记得把命名空间改成你自己的;
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Data;
//Zixi命令空间,别忘了改成你自己的。
namespace Zixi
{
class SkinClass
{
public static Sunisoft.IrisSkin.SkinEngine se = null;
///
/// 增加换肤菜单
///
///
public static void AddSkinMenu(ToolStripMenuItem toolMenu)
{
DataSet skin = new DataSet();
try
{
skin.ReadXml(”skin.xml”, XmlReadMode.Auto);
}
catch
{
}
if (skin == null || skin.Tables.Count < 1)
{
skin = new DataSet();
skin.Tables.Add("skin");
skin.Tables["skin"].Columns.Add("style");
System.Data.DataRow dr = skin.Tables["skin"].NewRow();
dr[0] = "系统默认";
skin.Tables[0].Rows.Add(dr);
skin.WriteXml("skin.xml", XmlWriteMode.IgnoreSchema);
}
foreach (SkinType st in (SkinType[])System.Enum.GetValues(typeof(SkinType)))
{
toolMenu.DropDownItems.Add(new ToolStripMenuItem(st.ToString()));
toolMenu.DropDownItems[toolMenu.DropDownItems.Count - 1].Click += new EventHandler(frm_Main_Click);
if (st.ToString() == skin.Tables[0].Rows[0][0].ToString())
{
((ToolStripMenuItem)toolMenu.DropDownItems[toolMenu.DropDownItems.Count - 1]).Checked = true;
frm_Main_Click(toolMenu.DropDownItems[toolMenu.DropDownItems.Count - 1], null);
}
}
toolMenu.DropDownItems.Add(new ToolStripMenuItem("系统默认"));
toolMenu.DropDownItems[toolMenu.DropDownItems.Count - 1].Click += new EventHandler(frm_Main_Click);
if (skin.Tables[0].Rows[0][0].ToString() == "系统默认")
{
((ToolStripMenuItem)toolMenu.DropDownItems[toolMenu.DropDownItems.Count - 1]).Checked = true;
}
}
static void frm_Main_Click(object sender, EventArgs e)
{
for (int i = 0; i < ((ToolStripMenuItem)((ToolStripMenuItem)sender).OwnerItem).DropDownItems.Count; i++)
{
if (((ToolStripMenuItem)sender).Text == ((ToolStripMenuItem)((ToolStripMenuItem)sender).OwnerItem).DropDownItems[i].Text)
{
((ToolStripMenuItem)sender).CheckState = CheckState.Checked;
DataSet skin = new DataSet();
skin.Tables.Add("skin");
skin.Tables["skin"].Columns.Add("style");
System.Data.DataRow dr = skin.Tables["skin"].NewRow();
dr[0] = ((ToolStripMenuItem)((ToolStripMenuItem)sender).OwnerItem).DropDownItems[i].Text;
skin.Tables[0].Rows.Add(dr);
skin.WriteXml("skin.xml", XmlWriteMode.IgnoreSchema);
}
else
{
((ToolStripMenuItem)((ToolStripMenuItem)((ToolStripMenuItem)sender).OwnerItem).DropDownItems[i]).CheckState = CheckState.Unchecked;
}
}
if (((ToolStripMenuItem)sender).Text == "系统默认")
{
RemoveSkin();
DataSet skin = new DataSet();
skin.Tables.Add("skin");
skin.Tables["skin"].Columns.Add("style");
System.Data.DataRow dr = skin.Tables["skin"].NewRow();
dr[0] = "系统默认";
skin.Tables[0].Rows.Add(dr);
skin.WriteXml("skin.xml", XmlWriteMode.IgnoreSchema);
return;
}
foreach (SkinType st in (SkinType[])System.Enum.GetValues(typeof(SkinType)))
{
if (st.ToString() == ((ToolStripMenuItem)sender).Text)
{
ChangeSkin(st);
return;
}
}
}
///
/// 改变皮肤
///
///
public static void ChangeSkin(SkinType st)
{
System.Reflection.Assembly thisDll = System.Reflection.Assembly.GetExecutingAssembly();
if (se == null)
{
//Zixi是指命名空间,这里你可以换成你自己的。
se = new Sunisoft.IrisSkin.SkinEngine(Application.OpenForms[0], thisDll.GetManifestResourceStream(”Zixi.skin.” + st.ToString() + “.ssk”));
se.Active = true;
for (int i = 0; i < Application.OpenForms.Count; i++)
{
se.AddForm(Application.OpenForms[i]);
}
}
else
{
//Zixi是指命名空间,这里你可以换成你自己的。
se.SkinStream = thisDll.GetManifestResourceStream("Zixi.skin." + st.ToString() + ".ssk");
se.Active = true;
}
}
///
/// 移除皮肤
///
public static void RemoveSkin()
{
if (se == null)
{
return;
}
else
{
se.Active = false;
}
}
}
///
/// 换肤类型
///
public enum SkinType
{
Calmness,
DeepCyan,
Eighteen,
Emerald,
GlassBrown,
Longhorn,
MacOS,
Midsummer,
MP10,
MSN,
OneBlue,
Page,
RealOne,
Silver,
SportsBlack,
SteelBlack,
vista1,
Vista2,
Warm,
Wave,
XPSilver
}
}
然后在你的主窗体里面添加菜单项,随便建一个二级菜单,如:系统→换肤,然后在主窗体的Form_Load事件里添加代码:
private void Form1_Load(object sender, EventArgs e)
{
//“换肤ToolStripMenuItem” 是上面菜单里“换肤”菜单的这个ToolStripMenuItem的Name。
SkinClass.AddSkinMenu(换肤ToolStripMenuItem);
}
类里面的两个方法是主要换肤用的:
ChangeSkin方法:换肤
RemoveSkin方法:恢复系统默认皮肤
(转载注明出处:http://www.zixi.net/)