首页 > 代码库 > 关于winform主题IrisSkin2的编写

关于winform主题IrisSkin2的编写

第一步:首先引用IrisSkin2.dll。

第二步自定义类:

 

/// <summary>    /// 窗体主题边界类    /// </summary>    public class FormSkin : SkinEngine    {        /// <summary>        /// 主题单例        /// </summary>        private static FormSkin Skin;        /// <summary>        /// 构造函数        /// </summary>        /// <param name="path">皮肤文件的位置</param>        private FormSkin(string path)        {            _skinNames = new List<string>();            DicSkins = new Dictionary<string, string>();            GetSkins(path);        }        /// <summary>        /// 主题存放位置        /// </summary>        /// <param name="path"></param>        /// <returns></returns>        public static FormSkin CreateSkin(string path)        {            if (Skin == null)            {                Skin = new FormSkin(path);                             }            return Skin;        }        #region 字段        /// <summary>        /// 主题名称        /// </summary>        private List<string> _skinNames ;        #endregion        #region 属性        /// <summary>        /// 主题名称        /// </summary>        public string[] SkinNames { get { return _skinNames.ToArray(); }  }        /// <summary>        /// 主题名称与路径的字典        /// </summary>        protected Dictionary<string, string> DicSkins { get; set; }        #endregion        #region protected方法        /// <summary>        /// 获取主题信息        /// </summary>        /// <param name="path"></param>        protected virtual void GetSkins(string path)        {            foreach (string file in Directory.GetFiles(path, "*.ssk", SearchOption.AllDirectories))            {                int index = file.LastIndexOf(@"\");                var _name = file.Substring(index + 1, file.Length - index - 5).Trim();                if (!_skinNames.Contains(_name)) _skinNames.Add(_name);                if (!DicSkins.Keys.Contains(_name)) DicSkins.Add(_name, file);             }        }        #endregion        #region public方法        /// <summary>        /// 设置皮肤        /// </summary>        /// <param name="key">根据名称</param>        /// <returns></returns>        public bool SetSkin(string key)        {            if (DicSkins.Keys.Contains(key))            {                var file = DicSkins[key];                if (File.Exists(file))                {                    Skin.SkinFile = file;                    return true;                }            }            return false;        }        #endregion    }

 这个是我自己写的。不一定很好,你们也可以自定义,我是属于菜鸟级别的。哈哈。用了一个单例。 其实主要也就是这样一个类

主要原理 其实是很简单的:首先是创建单列的时候需要提供一个位置,然后根据这个位置去查找*.ssk文件也就是皮肤主题文件  ,然后把 主题名称用一个只读集合公开出来,注意我用的是String[]数组 而不是List<string> 至于这两个的细微区别我就不多说了。 然后把 主题名称和主题的存放位置存放起来 , 通过一个SetSkin来更换皮肤。

 

第三步:调用

 //主题            Skin = LqwCourse.Base.FormSkin.CreateSkin(AppDomain.CurrentDomain.BaseDirectory);            Skin.SetSkin(Skin.SkinNames.Length > 0 ? Skin.SkinNames[0] : "");

 下面是我自己弄的一个测试效果图

欢迎各位大侠指点一下。。 让我学习学习