首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于skinEngine皮肤控件的有关问题

2012-03-24 
关于skinEngine皮肤控件的问题大致是这样的情况:用户点击一个选项,执行代码skinEngine1.SkinFile Midsu

关于skinEngine皮肤控件的问题
大致是这样的情况:
用户点击一个选项,执行代码skinEngine1.SkinFile = "Midsummer.ssk";更换他想要的皮肤。
用户点击另一个选项,恢复默认时的界面状况,该如何实现?多谢啊!

[解决办法]
参考:
1:控件(破解版,只限.Net2005)和皮肤下载地址如下http://download1.csdn.net/down3/20070605/05142029888.rar

DEMO程序(含源码)

http://dl2.csdn.net/down4/20070628/28181121698.rar

2:载入

下载后的rar文件里有一个IrisSkin2.dll和一个skin文件夹。

添加引用,将IrisSkin2.dll引用进项目中。

然后在解决方案资源管理器里右击项目→添加→新建文件夹,文件夹名为skin。

建完skin文件夹后再右击这个文件夹→添加→现有项,在弹出的文件选择框里选*.*所有文件,再把解压出来的skin文件夹里的所有文件全选进去。

这时候我们可以看到skin文件夹里已经有了我们添加的所有的换肤文件了。再按ctrl键选中所有的skin文件夹里的文件,在属性栏里可以看到“生成操作”一栏,默认选项是“无”,我们把它改成“嵌入的资源”。

3:类

下面我们新建一个类,把以下的代码复制进去,别忘了把命名空间改成你自己的。

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Windows.Forms; 
using System.Data;

//TestSkin命令空间,别忘了改成你自己的。 
namespace TestSkin 

class SkinClass 

public static Sunisoft.IrisSkin.SkinEngine se = null; 
/// <summary> 
/// 增加换肤菜单 
/// </summary> 
/// <param name="toolMenu"></param> 
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; 



/// <summary> 
/// 改变皮肤 
/// </summary> 
/// <param name="st"></param> 
public static void ChangeSkin(SkinType st) 

System.Reflection.Assembly thisDll = System.Reflection.Assembly.GetExecutingAssembly(); 
if (se == null) 

//TestSkin是指命名空间,这里你可以换成你自己的。 
se = new Sunisoft.IrisSkin.SkinEngine(Application.OpenForms[0], thisDll.GetManifestResourceStream("TestSkin.skin." + st.ToString() + ".ssk")); 
se.Active = true; 
for (int i = 0; i < Application.OpenForms.Count; i++) 

se.AddForm(Application.OpenForms[i]); 
}


else 

//TestSkin是指命名空间,这里你可以换成你自己的。 
se.SkinStream = thisDll.GetManifestResourceStream("TestSkin.skin." + st.ToString() + ".ssk"); 
se.Active = true; 


/// <summary> 
/// 移除皮肤 
/// </summary> 
public static void RemoveSkin() 

if (se == null) 

return; 

else 

se.Active = false; 



/// <summary> 
/// 换肤类型 
/// </summary> 
public enum SkinType 

Calmness, 


DeepCyan, 
Eighteen, 
Emerald, 
GlassBrown, 
Longhorn, 
MacOS, 
Midsummer, 
MP10, 
MSN, 
OneBlue, 
Page, 
RealOne, 
Silver, 
SportsBlack, 
SteelBlack, 
vista1, 
Vista2, 
Warm, 
Wave, 
XPSilver 

}


4:调用

在你的主窗体里加上一个MenuStrip菜单,建一个2级菜单(如:文件→更换皮肤),然后在Form_Load事件里写上调用代码:

private void Form1_Load(object sender, EventArgs e) 

//“更换皮肤ToolStripMenuItem” 是上面例子里“更换皮肤”这个ToolStripMenuItem的Name。 
SkinClass.AddSkinMenu(更换皮肤ToolStripMenuItem); 
}

5:注

以下两个方法是主要换肤用的:

ChangeSkin方法换肤

RemoveSkin方法恢复系统默认皮肤

大家可以不用直接给单独一个窗体换肤。我以上的代码是生成一个换肤菜单,然后所有的窗体都是自动进行换肤了。

//其他控件:

1. 东日IrisSkin 
IrisSkin 共有两个版本,一个是IrisSkin.dll 用于.Net Framework1.0/1.1 和IrisSkin2.dll 用于.Net Framework2.0版本。详细内容见安装文件的help文档。
除此之外,东日还有两个很cool的Menu: MatrixMenu和WheelMenu。
(详细内容请参见http://www.sunisoft.cn/irisskin)。

2. Skin++
这个是我最初使用过的换肤控件,通过添加一个com引用,然后初始化一个skin对象,通过InitializeSkin引入ssk文件进行换肤。(详细内容请参见http://www.uipower.com)。

3.DotNetSkin
DotNetSkin的用法和IrisSkin差不多。此外,网站提供了几个免费的很cool的控件,
Button,RadioButton, CheckBox, 那个button和codeproject的XPButton有的一拼了。
(详细内容请参见http://www.dotnetskin.net)。

4.SkinCrafter
SkinCrafter地用法和Skin++有点类似,都是添加一个Com引用,然后加上几句语句用来Load皮肤,和Apply皮肤。另外,SkinCrafter还另外提供了为Windows Installer换肤的软件。
(详细内容请参见http://www.skincrafter.com)。

5.Appface
Appface支持的语言与开发环境是我见到的最多的,在。net上面使用起来相对前面4中都相对复杂一点, 不过看看那个Demo也差不多会了,还是几个函数的使用。
(详细内容请参见http://www.appface.net)。

6.SkinEngine
Alcyonesoft推出了SkinEngine,支持的语言数目与Appface不相上下,用法和Skin++, SkinCrafter类似。(详细内容参见http://www.ksdev.com)

其他还有
DotNetMagic提供了许多漂亮的控件(http://www.dotnetmagic.com),
DotNetBar许多很有创意,很炫的控件(http://www.devcomponents.com)
Divelements 的许多漂亮的控件(http://www.divelements.co.uk)
另外国内的。net控件网搜集了很多。net下的控件(http://www.dnc.com.cn)
 


[解决办法]
用一个常量保存默认的皮肤文件哪。。。。

热点排行