zoukankan      html  css  js  c++  java
  • 关于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] : "");
    

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

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

  • 相关阅读:
    redis 秒杀设计,常用命令
    wamp下配置多域名和访问路径的方法
    git commit 因执行yarn , npm,报错推送不了
    taro bug--小程序报错Error: 未找到入口 sitemap.json 文件,或者文件读取失败,请检查后重新编译。
    vscode引用相对路径,scss时路径报错问题解决
    space-between与space-around的区别
    Android可设置任意高度的TextView,如:设置0.5px设置0.1px等等
    Android可以打开微信支付,但是没法调起小程序支付
    dask
    Joblib-lightweight piplining tool
  • 原文地址:https://www.cnblogs.com/huanself/p/3848868.html
Copyright © 2011-2022 走看看