c\#winform 테마 구현 방법

9162 단어 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.ITheme Control 을 실현 하고 구조 함수 에 Checked ThemeEvent 이 벤트 를 추가 합 니 다.
    
    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 테마 실현 에 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기