我在做项目时遇到了一个关于c#皮肤更换的问题,就是那个皮肤只对主界面起作用,而子窗体的皮肤却为更换,开始我登录时还可以,但是后来我把那个皮肤的文件名称放到数据库里面,根据数据库里面的去更换,却只更换了主窗体的!子窗体的还是原来的皮肤。郁闷,有哪位知道解决的方法?谢谢了!

解决方案 »

  1.   

    第一步,定义一个表示支持皮肤更换操作的接口,该接口可以只有一个方法,就是应用当前皮肤设置第二步,你的主窗体和所有相关子窗体都实现这个接口,实现应用当前皮肤设置的功能第三步,在你更改皮肤设置事件中实现如下逻辑:遍历application中所有窗体,判断其是否实现了第一步定义的接口,若是,则调用哪个应用当前皮肤设置的方法over
      

  2.   

    You can refer to the design pattern of System.Windows.Forms.ToolStrip and its related classes. I hope you can get success.
      

  3.   

    这是我新作的一个项目里的换肤操作类,正好可以解决你说的问题,希望对你有帮助!
    可以参考一下!   public class SkinsClass
        {
            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) 
                 { 
                     se = new Sunisoft.IrisSkin.SkinEngine(Application.OpenForms[0], thisDll.GetManifestResourceStream("个人通讯录.skin." + st.ToString() + ".ssk")); 
                     se.Active = true; 
                     for (int i = 0; i < Application.OpenForms.Count; i++) 
                     { 
                         se.AddForm(Application.OpenForms[i]); 
                     } 
                 } 
                 else 
                 { 
                     se.SkinStream = thisDll.GetManifestResourceStream("个人通讯录.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
        {
            蓝宝石风格,
            Vista风格,
            绿宝石风格,
            RealOne风格,
            苹果风格,
            Longhorn风格,
        } 
      

  4.   

    http://blog.csdn.net/yicel/archive/2007/04/16/1566577.aspx
      

  5.   

    需要遍历application中所有窗体