c# winform主题实现的方法

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

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

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

2、一个主题接口

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

 }

3、一个主题控制类

/// <summary>
 /// 主题设置
 /// </summary>
 public class Theme
 {
  internal delegate void CheckedThemeEventHandle(ITheme theme);
  /// <summary>
  /// 改变主题事件
  /// </summary>
  static internal event CheckedThemeEventHandle CheckedThemeEvent;
  static ITheme currentTheme;
  /// <summary>
  /// 当前主题
  /// </summary>
  internal static ITheme CurrentTheme
  {
   get { return currentTheme; }
   set
   {
    if (value == null)
     return;
    currentTheme = value;
    currentTheme.Init();
    if (CheckedThemeEvent != null)
    {
     CheckedThemeEvent(value);
    }
   }
  }
  /// <summary>
  /// 加载控件的主题
  /// </summary>
  /// <param name="control"></param>
  internal static void LoadTheme(IThemeControl control)
  {
   control.ResetTheme();
  }
 }

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

public interface IThemeBaseForm
 {
  /// <summary>
  /// 基本窗体背景色
  /// </summary>
  Color BaseFormBackgroundColor { get; }
  /// <summary>
  /// 基本窗体文字颜色
  /// </summary>
  Color BaseFormForeColor { get; }
  /// <summary>
  /// 标题栏颜色
  /// </summary>
  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; }
 }

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

深色的

/// <summary>
 /// 深色
 /// </summary>
 public partial class Dark :
  ITheme,
  IThemeBaseForm,
  IThemeFrmLock,
  IThemeUCFileItem
 {

  public int Code { get { return 1; } }
  /// <summary>
  /// 基本窗体背景色
  /// </summary>
  public Color BaseFormBackgroundColor { get { return Color.FromArgb(37, 41, 59); } }
  /// <summary>
  /// 基本窗体文字颜色
  /// </summary>
  public Color BaseFormForeColor { get { return Color.White; } }
  public Color BaseFormTitleColor { get { return Color.FromArgb(38, 45, 67); } }

  /// <summary>
  /// 初始化操作
  /// </summary>
  public void Init()
  {
   //这里做一些修改主题时候的业务
  }
  #region 重写运算符
  /// <summary>
  /// 重写==
  /// </summary>
  /// <param name="lhs"></param>
  /// <param name="rhs"></param>
  /// <returns></returns>
  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;
   }
  }

  /// <summary>
  /// 重写!=
  /// </summary>
  /// <param name="lhs"></param>
  /// <param name="rhs"></param>
  /// <returns></returns>
  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

这些接口就行(定义的控件接口,这里都要进行实现)
然后添加具体的控件主题实现类

/// <summary>
 /// FrmLock
 /// </summary>
 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;
  /// <summary>
  /// 当前页面正在使用的主题
  /// </summary>
  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://www.cnblogs.com/bfyx/
HZHControls官网:http://www.hzhcontrols.com

以上就是c# winform主题实现的方法的详细内容,更多关于c# winform主题实现的资料请关注我们其它相关文章!

(0)

相关推荐

  • C# 使用Winform 获取下拉框 选中的值

    我就废话不多说了,大家还是直接看代码吧~ string PrintName = cmbPrinter.SelectedIndex.ToString(); PrintName = cmbPrinter.SelectedItem.ToString(); // if (cmbPrinter.SelectedIndex != 0) { } string PrintName = ""; PrintName = cmbPrinter.SelectedItem.ToString(); //"

  • C#实现飞行棋(Winform)

    本文实例为大家分享了C#实现飞行棋的具体代码,供大家参考,具体内容如下 基于Winform框架写的 不足之处请大佬指教 using System; using System.Drawing; using System.Windows.Forms; namespace 飞行棋 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //创建一个数组装游戏地板 int[] mapList = ne

  • C#开发WinForm之DataGridView开发详解

    前言 DataGridView是开发Winform的一个列表展示,类似于表格.学会下面的基本特征用法,再辅以经验,基本功能开发没问题. 基本的数据渲染 根据提供的数据展示出效果. 提供给DataGridView数据源有很多方式,大致有如下三种: 直接增加,每个单元格类型都是DataGridViewTextBoxCell int index=this.dataGridView1.Rows.Add(); this.dataGridView1.Rows[index].Cells[0].Value =

  • C# Winform中如何绘制动画示例详解

    前言 这里介绍一个.net自身携带的类ImageAnimator,这个类类似于控制动画的时间轴,使用ImageAnimator.CanAnimate可以判断一个图片是否为动画,调用ImageAnimator.Animate可以开始播放动画,即每经过一帧的时间触发一次OnFrameChanged委托,我们只要在该委托中将Image的活动帧选至下一帧再迫使界面重绘就可以实现动画效果了. 为了方便以后的使用,我将这些代码整合到了一起,形成一个AnimateImage类,该类提供了CanAnimate.

  • c# winform 解决PictureBox 无法打印全部图片的问题

    作者:沐汐 Vicky 出处:http://www.cnblogs.com/EasyInvoice 一.   问题描述 在页面使用PictureBox 加载资料图片后,点击"打印",只能打印图片首页,较大图片则无法全部打印. 二.   原因分析 PictureBox中打印图片时没有设置继续打印相关属性,因此每次只能打印第1页. 三.解决方法 PictureBox控件增加打印全部页面属性,如果为True,表示打印全部页面:如果为False,保留原有逻辑不变. 在打印全部页面时,将控件的图

  • C# 如何在WINForm程序中创建XML文件

    <?xml version="1.0" encoding="gb2312"?> <FilesInformation>   <version>1.0.1818.42821</version>   <description>说明</description>   <FileItem    FileName="name"   FileVersion="sdf"

  • 新手小白用C# winform 读取Excel表的实现

    一.界面部分: 首先,打开visual studio新建项目: 然后使用"工具箱"添加控件:分别添加button,datagridview,textbox三种窗体: 所得到的界面图如图所示:(多加了几个文本框) 二.代码部分: 1.添加命名空间: using System.Data.OleDb; //命名空间 2.添加类: //根据excle的路径把第一个sheel中的内容放入datatable public static DataTable ReadExcelToTable(stri

  • C# winform中窗口关闭按钮的隐藏与禁用详解

    首先说一句: 不存任何一种方式可以单独隐藏关闭按钮,隐藏的话会把所有最大化,最小化,帮助,关闭按钮都给隐藏掉. 第一种:禁用窗口上部的关闭按钮 方法一:在Form1的窗口程序中desigener设计器中重写如下方法:(将此部分粘贴到窗口程序中去就可以了) protected override void WndProc(ref Message m) { const int WM_SYSCOMMAND = 0x0112; const int SC_CLOSE = 0xF060; if (m.Msg

  • C# WinForm状态栏实时显示当前时间(窗体状态栏StatusStrip示例)

    本文主要介绍了C# WinForm状态栏实时显示当前时间(窗体状态栏StatusStrip示例),分享给大家,具体如下: 实现效果:通过StatusStrip显示窗体状态栏,同时将状态栏分成三部分: 居左边显示相关文字信息及时间信息,中间操作系统登录名,居右边显示本地IP. 步骤: 1.创建窗体及添加StatusStrip 默认StatusStrip名称为statusStrip1 2.在statusStrip1的Items属性中 添加三个StatusLabel 默认名称为toolStripSta

  • C# Winform调用百度接口实现人脸识别教程(附源码)

    百度是个好东西,这篇调用了百度的接口(当然大牛也可以自己写),人脸检测技术,所以使用的前提是有网的情况下.当然大家也可以去参考百度的文档. 话不多说,我们开始: 第一步,在百度创建你的人脸识别应用 打开百度AI开放平台链接: 点击跳转百度人脸检测链接,创建新应用 创建成功成功之后.进行第二步 第二步,使用API Key和Secret Key,获取 AssetToken 平台会分配给你相关凭证,拿到API Key和Secret Key,获取 AssetToken 接下来我们创建一个AccessTo

  • C#-WinForm跨线程修改UI界面的示例

    背景 在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作.他们会引发软件的卡顿甚至假死,严重影响软件的使用.因此,这类耗时或阻塞的操作一般都会使用异步的方式去执行,不影响主线程(UI线程)与用户间的交互.但多个线程竞争读写同一个资源往往会造成意想不到的意外结果,UI界面也是一种资源,所以跨线程修改UI界面往往被加以限制.而在Winform中,跨线程修改UI界面同样是不被允许的.在子线程中修改界面控件时Visual Studio会报出如下错误: 解决思路 .Net提供了很多跨线程修改U

随机推荐