如何在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