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、一个主题控制类
1 /// <summary>
2 /// 主题设置
3 /// </summary>
4 public class Theme
5 {
6 internal delegate void CheckedThemeEventHandle(ITheme theme);
7 /// <summary>
8 /// 改变主题事件
9 /// </summary>
10 static internal event CheckedThemeEventHandle CheckedThemeEvent;
11 static ITheme currentTheme;
12 /// <summary>
13 /// 当前主题
14 /// </summary>
15 internal static ITheme CurrentTheme
16 {
17 get { return currentTheme; }
18 set
19 {
20 if (value == null)
21 return;
22 currentTheme = value;
23 currentTheme.Init();
24 if (CheckedThemeEvent != null)
25 {
26 CheckedThemeEvent(value);
27 }
28 }
29 }
30 /// <summary>
31 /// 加载控件的主题
32 /// </summary>
33 /// <param name="control"></param>
34 internal static void LoadTheme(IThemeControl control)
35 {
36 control.ResetTheme();
37 }
38 }
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();
效果
c#winform主题实现的一个方法的更多相关文章
- C# winform调用浏览器打开页面方法分享,希望对大家有帮助
在很多客户端程序中我们都需要调用浏览器打开网页,这里分享一个可以在我winform程序调用浏览器的方法,测试通过了. 声明:这个方法是上万个用户测试通过的,不是我没有测试通过就拿出来分享,那个是自己搬 ...
- 关于winform主题IrisSkin2的编写
第一步:首先引用IrisSkin2.dll. 第二步自定义类: /// <summary> /// 窗体主题边界类 /// </summary> public class Fo ...
- C#WinForm无边框窗体移动方法、模仿鼠标单击标题栏移动窗体位置
C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...
- WinForm无边框窗体移动方法
C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...
- 35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n); (2)编写一个类:ClassA来实现接口InterfaceA,实现int method(int n)接口方 法时,要求计算1到n的和; (3)编写另一个类:ClassB来实现接口InterfaceA,实现int method(int n)接口 方法时,要求计算n的阶乘(n
35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n): (2)编写一个类:ClassA来实现接口InterfaceA,实现in ...
- JavaScript中以一个方法作为参数的写法
前言,我们写js的时候,经常会看到一些方法,比如说: $("#ids").click(function( alert("Click me"); )); ---- ...
- 20款最佳用户体验的Sublime Text 2/3主题下载及安装方法
20款最佳用户体验的Sublime Text 2/3主题下载及安装方法
- ERROR: “System.Web.Mvc.Controller.File(string, string, string)”是一个“方法”
ERROR: “System.Web.Mvc.Controller.File(string, string, string)”是一个“方法”,这在给定的上下文中无效 这是一个与Controller.F ...
- iOS之下拉放大,上推缩小,一个方法搞定
先来看看效果吧. 讲讲大概的实现思路:1、创建头部的视图和tableview,需要注意的是tableview要设置contentInset,contentInsent 的顶部要和头部视图的背景图的高度 ...
随机推荐
- msf+cobaltstrike联动(二):把cs中的机器spwan给msf
前提:CS已经获取到session,可以进入图形化管理机器,现在需要使用msf进行进一步渗透,需要msf的metepreter. 开启msf msf设置监听 msf > use exploit/ ...
- 25.sshd和scp
1.配置sshd服务 想要使用 SSH 协议来远程管理Linux 系统,则需要部署配置sshd 服务程序.sshd 是基于SSH协议开发的一款远程管理服务程序. sshd 服务的配置信息保存在/e ...
- hdu4778 Gems Fight!
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 327680/327680 K (Java/Others) Total Submis ...
- PowerShell随笔4---变量
全局变量 输入$global:后按ctrl+space,我们就可以看到所有的全局变量. 比如我们可以查看PowerShell的版本: 我们可以在在编写脚本代码的时候使用这些变量,globle可以省略, ...
- Spring Cloud实战: 基于Spring Cloud Gateway + vue-element-admin 实现的RBAC权限管理系统,实现网关对RESTful接口方法权限和自定义Vue指令对按钮权限的细粒度控制
一. 前言 信我的哈,明天过年. 这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT ...
- Http和Https之为什么Https更安全
[除夕了,加油干.希望自己新的一年万事顺意,祝大家身体健康,心想事成!] 我们都知道 HTTPS 安全,可是为什么安全呢? 看小电影还是浏览正常网站,一定要检查是不是 HTTPS 的,因为Https相 ...
- 根据直方图 histogram 进行简单的图像检索
https://github.com/TouwaErioH/Machine-Learning/tree/master/image%20identification/Histogram%20retrie ...
- 2018ACM上海大都会赛 F Color it【基础的扫描线】
题目:戳这里 题意:有n*m个点全为白色,q个圆,将q个圆内所有的点都染成黑色,问最后剩下多少白色的点. 解题思路:每一行当做一个扫描线,扫描所有的圆,记录每一行在圆中的点即可,O(n*q). 附ac ...
- 图解算法——链表中倒数第k个节点
题目来源: 剑指 Offer 22. 链表中倒数第k个节点 leetCode 题目描述: 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个 ...
- liunx命令二
声明:以下资料全部摘自实验楼 常用快捷键 按键 作用 Table 补全命令 Ctrl+c 强制结束 Ctrl+d 键盘输入结束或退出终端 Ctrl+s 暂停当前程序,暂停后按下任意键恢复运行 Ctrl ...