如何在c#项目中实现一个winform主题-创新互联
如何在c#项目中实现一个winform主题?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
10多年的定日网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。全网整合营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整定日建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联公司从事“定日网站设计”,“定日网站推广”以来,每个客户项目都认真落实执行。1、一个接口,需要做主题的控件、窗体都要实现这个接口
////// 使用主题的控件、窗体需要实现此接口 /// public interface IThemeControl { ITheme ThisTheme { get; set; } ////// 重置主题 /// void ResetTheme(); }
2、一个主题接口
////// 主题 /// public interface ITheme { int Code { get; } ////// 初始化 /// void Init(); }
3、一个主题控制类
////// 主题设置 /// public class Theme { internal delegate void CheckedThemeEventHandle(ITheme theme); ////// 改变主题事件 /// static internal event CheckedThemeEventHandle CheckedThemeEvent; static ITheme currentTheme; ////// 当前主题 /// internal static ITheme CurrentTheme { get { return currentTheme; } set { if (value == null) return; currentTheme = value; currentTheme.Init(); if (CheckedThemeEvent != null) { CheckedThemeEvent(value); } } } ////// 加载控件的主题 /// /// internal static void LoadTheme(IThemeControl control) { control.ResetTheme(); } }
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();
关于如何在c#项目中实现一个winform主题问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。
本文名称:如何在c#项目中实现一个winform主题-创新互联
分享URL:http://hbruida.cn/article/dsigii.html