博客
关于我
c#winform主题实现的一个方法
阅读量:403 次
发布时间:2019-03-06

本文共 7626 字,大约阅读时间需要 25 分钟。

winform的主题实现没有bs里面那么舒服,下面做了一个简单实现,记录一下。

1、一个接口,需要做主题的控件、窗体都要实现这个接口

///     /// 使用主题的控件、窗体需要实现此接口    ///     public interface IThemeControl    {        ITheme ThisTheme { get; set; }        ///         /// 重置主题        ///         void ResetTheme();    }

2、一个主题接口

///     /// 主题    ///     public interface ITheme    {        int Code { get;  }        ///         /// 初始化        ///         void Init();    }

3、一个主题控制类

1 ///  2     /// 主题设置 3     ///  4     public class Theme 5     { 6         internal delegate void CheckedThemeEventHandle(ITheme theme); 7         ///  8         /// 改变主题事件 9         /// 10         static internal event CheckedThemeEventHandle CheckedThemeEvent;11         static ITheme currentTheme;12         /// 13         /// 当前主题14         /// 15         internal static ITheme CurrentTheme16         {17             get { return currentTheme; }18             set19             {20                 if (value == null)21                     return;22                 currentTheme = value;23                 currentTheme.Init();24                 if (CheckedThemeEvent != null)25                 {26                     CheckedThemeEvent(value);27                 }28             }29         }30         /// 31         /// 加载控件的主题32         /// 33         /// 34         internal static void LoadTheme(IThemeControl control)35         {36             control.ResetTheme();37         }38     }

4、添加一个窗体通用的主题接口

public interface IThemeBaseForm    {        ///         /// 基本窗体背景色        ///         Color BaseFormBackgroundColor { get; }        ///         /// 基本窗体文字颜色        ///         Color BaseFormForeColor { get; }        ///         /// 标题栏颜色        ///         Color BaseFormTitleColor { get; }    }

5、添加对应的窗体或控件的主题接口

窗体的样式接口(例子)

public interface IThemeFrmLock : IThemeBaseForm    {        Color FrmLock_TxtFillColor { get; }        Color FrmLock_TxtRectColor { get; }        Color FrmLock_TxtForeColor { get; }        Color FrmLock_btnFillColor { get; }        Color FrmLock_btnForeColor { get; }        Color FrmLock_btnRectColor { get; }    }

控件的样式接口(例子)

public interface IThemeUCFileItem : ITheme    {        Color UCFileItem_BackgroundColor { get; }        Color UCFileItem_ForeColor { get; }        Color UCFileItem_BoxColor { get; }        Image UCFileItem_Img1 { get; }        Image UCFileItem_Img2 { get; }        Image UCFileItem_Img3 { get; }        Image UCFileItem_Img4 { get; }        Image UCFileItem_Img5 { get; }    }

 

我这里做一个深色一个浅色主题

深色的

///     /// 深色    ///     public partial class Dark :        ITheme,        IThemeBaseForm,               IThemeFrmLock,              IThemeUCFileItem          {        public int Code { get { return 1; } }        ///         /// 基本窗体背景色        ///         public Color BaseFormBackgroundColor { get { return Color.FromArgb(37, 41, 59); } }        ///         /// 基本窗体文字颜色        ///         public Color BaseFormForeColor { get { return Color.White; } }        public Color BaseFormTitleColor { get { return Color.FromArgb(38, 45, 67); } }        ///         /// 初始化操作        ///         public void Init()        {            //这里做一些修改主题时候的业务        }        #region 重写运算符        ///         /// 重写==        ///         ///         ///         /// 
public static bool operator ==(Dark lhs, ITheme rhs) { if (lhs == null && rhs == null) return true; else { if (lhs != null && rhs != null) { if (lhs.Code == rhs.Code) return true; else return false; } else return false; } } /// /// 重写!= /// /// /// ///
public static bool operator !=(Dark lhs, ITheme rhs) { if (lhs == null && rhs == null) return false; else { if (lhs != null && rhs != null) { if (lhs.Code == rhs.Code) return false; else return true; } else return true; } } public override bool Equals(object obj) { if (obj == null || GetType() != obj.GetType()) { return false; } if (obj is ITheme) { if (Code == ((ITheme)obj).Code) return true; else return false; } else { return false; } } public override int GetHashCode() { return base.GetHashCode(); } #endregion }

浅色的也一样  只需要实现

ITheme,IThemeBaseForm,       IThemeFrmLock,      IThemeUCFileItem     这些接口就行(定义的控件接口,这里都要进行实现) 然后添加具体的控件主题实现类
///     /// FrmLock    ///     public partial class Dark    {        public Color FrmLock_TxtFillColor { get { return Color.FromArgb(34, 40, 60); } }        public Color FrmLock_TxtRectColor { get { return Color.FromArgb(65, 75, 101); } }        public Color FrmLock_TxtForeColor { get { return Color.White; } }        public Color FrmLock_btnFillColor { get { return Color.FromArgb(46, 54, 76); } }        public Color FrmLock_btnForeColor { get { return Color.FromArgb(175, 193, 225); } }        public Color FrmLock_btnRectColor { get { return Color.FromArgb(65, 75, 101); } }    }
然后就是去控件或窗体里面做事情了,实现接口Theme.IThemeControl,构造函数里面添加CheckedThemeEvent事件
public partial class FrmLock : FrmWithTitle,Theme.IThemeControl    {        public FrmLock()        {            try            {                InitializeComponent();                               Theme.Theme.CheckedThemeEvent += Theme_CheckedThemeEvent;            }            catch (Exception ex)            {                            }        }        void Theme_CheckedThemeEvent(Theme.ITheme theme)        {            if (this.Visible)            {                ThisTheme = theme;            }        }

VisibleChanged事件添加内容

private void FrmLock_VisibleChanged(object sender, EventArgs e)        {            if (Visible)            {                ThisTheme = Theme.Theme.CurrentTheme;            }        }

实现的接口

Theme.ITheme thisTheme = null;        ///         /// 当前页面正在使用的主题        ///         public Theme.ITheme ThisTheme        {            get            {                if (thisTheme == null)                {                    ThisTheme = Theme.Theme.CurrentTheme;                }                return thisTheme;            }            set            {                if (thisTheme != value)                {                    thisTheme = value;                    Theme.Theme.LoadTheme(this);                }            }        }        public void ResetTheme()        {            var t = (Theme.IThemeFrmLock)ThisTheme;            this.BackColor = t.BaseFormBackgroundColor;            this.lblTitle.BackColor = t.BaseFormTitleColor;            this.lblTitle.ForeColor = t.BaseFormForeColor;            ucControlBase1.FillColor = t.FrmLock_TxtFillColor;            ucControlBase1.RectColor = t.FrmLock_TxtRectColor;            txtPW.BackColor = t.FrmLock_TxtFillColor;            txtPW.ForeColor = t.FrmLock_TxtForeColor;            tongyong_btnPaiZhaoPath.FillColor = t.FrmLock_btnFillColor;            tongyong_btnPaiZhaoPath.RectColor = t.FrmLock_btnRectColor;            tongyong_btnPaiZhaoPath.ForeColor = t.FrmLock_btnForeColor;        }

以上就是修改代码,下面看调用

Theme.Theme.CurrentTheme = new Theme.Dark();

 

效果

 

 

 

转载地址:http://ycvkz.baihongyu.com/

你可能感兴趣的文章
MongoDB版本及存储引擎区别
查看>>
cmp命令
查看>>
Linux 磁盘管理(df fu fdisk mkfs mount)
查看>>
jQuery的事件绑定与触发 - 学习笔记
查看>>
Linux上TCP的几个内核参数调优
查看>>
记一次讲故事机器人的开发-我有故事,让机器人来读
查看>>
seo 回忆录百度基本概念(一)
查看>>
kettle 执行 kjb 临时文件夹 /tmp permission denied 问题
查看>>
netcore中使用session
查看>>
Android 开发学习进程0.25 自定义控件
查看>>
多媒体文件格式全解说(下)--图片
查看>>
淘宝WAP版小BUG分析
查看>>
【Maven】POM基本概念
查看>>
【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?
查看>>
远程触发Jenkins的Pipeline任务的并发问题处理
查看>>
entity framework core在独立类库下执行迁移操作
查看>>
Asp.Net Core 2.1+的视图缓存(响应缓存)
查看>>
【wp】HWS计划2021硬件安全冬令营线上选拔赛
查看>>
Ef+T4模板实现代码快速生成器
查看>>
Java面试题:Servlet是线程安全的吗?
查看>>