WinForm 主题实现方法

转自:冰封一夏

cnblogs.com/bfyx/p/14440058.html

前言

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();

效果

df667eab05fbe167c749648b7baebf75.gif

- EOF -

技术群:添加小编微信dotnet999

公众号:dotnet讲堂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在WinForm实现邮件发送功能,可以使用 .NET Framework提供的 System.Net.Mail 命名空间。下面是一个简单的示例代码: ```c# using System; using System.Net; using System.Net.Mail; using System.Windows.Forms; namespace EmailSender { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void btnSend_Click(object sender, EventArgs e) { try { // 创建一个MailMessage对象 MailMessage message = new MailMessage(); // 设置发件人邮箱地址 message.From = new MailAddress(txtFrom.Text.Trim()); // 设置收件人邮箱地址 message.To.Add(new MailAddress(txtTo.Text.Trim())); // 设置邮件主题 message.Subject = txtSubject.Text.Trim(); // 设置邮件内容 message.Body = txtBody.Text.Trim(); // 创建一个SmtpClient对象 SmtpClient client = new SmtpClient(); // 设置SMTP服务器地址 client.Host = txtSmtpServer.Text.Trim(); // 设置SMTP服务器端口号,默认为25 if (!string.IsNullOrEmpty(txtSmtpPort.Text.Trim())) { client.Port = Convert.ToInt32(txtSmtpPort.Text.Trim()); } // 设置SMTP服务器用户名和密码 if (!string.IsNullOrEmpty(txtSmtpUser.Text.Trim()) && !string.IsNullOrEmpty(txtSmtpPassword.Text.Trim())) { client.Credentials = new NetworkCredential(txtSmtpUser.Text.Trim(), txtSmtpPassword.Text.Trim()); } // 发送邮件 client.Send(message); MessageBox.Show("邮件发送成功!"); } catch (Exception ex) { MessageBox.Show("邮件发送失败!\r\n" + ex.Message); } } } } ``` 注意,为了让程序能够发送邮件,需要确保计算机已连接到网络,并且SMTP服务器的地址、端口号、用户名和密码等信息正确无误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值