하아찡

[C#/WPF] PublicColor 프로젝트 본문

C#/코인프로그램 - 코드

[C#/WPF] PublicColor 프로젝트

하아찡 2023. 11. 30. 14:52

UI쪽 컬러를 저장하고 불러와서 적용하는 방식을 사용하기위해 작업함.

 

Colors.cs

using FileIO;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Windows.Media;

namespace PublicColor
{
    public class Colors : BindableBase
    {
        private static Colors colorinstance;
        public static Colors Colorinstance
        {
            get
            {
                if (colorinstance == null) colorinstance = new Colors();

                return colorinstance;
            }
        }

        #region Models
        //해당 색상을 베이스로 약간 변경 할 예정
        private Brush colorbid;                 //매수 기본색
        public Brush ColorBid
        {
            get { return colorbid; }
            set { SetProperty(ref colorbid, value);}
        }
        private Brush colorbidback;             //매수 기본 배경색
        public Brush ColorBidBack
        {
            get { return colorbidback; }
            set { SetProperty(ref colorbidback, value); }
        }

        private Brush colorask;                 //매도 기본색
        public Brush ColorAsk
        {
            get { return colorask; }
            set { SetProperty(ref colorask, value); }
        }
        private Brush coloraskback;             //매도 기본 배경색
        public Brush ColorAskBack
        {
            get { return coloraskback; }
            set { SetProperty(ref coloraskback, value); }
        }


        private Brush colortext;                //기본 텍스트색
        public Brush ColorText
        {
            get { return colortext; }
            set { SetProperty(ref colortext, value); }
        }

        public Brush colorback;                //기본 배경색
        public Brush ColorBack
        {
            get { return colorback; }
            set { SetProperty(ref colorback, value); }
        }

        private Brush colorborder;              //기본 배경색에 대한 테두리 색
        public Brush ColorBorder
        {
            get { return colorborder; }
            set { SetProperty(ref colorborder, value); }
        }

        private Brush colordefault;
        public Brush ColorDefault
        {
            get { return colordefault; }
            set { SetProperty(ref colordefault, value); }
        }

        private Brush colordefaultback;
        public Brush ColorDefaultBack
        {
            get { return colordefaultback; }
            set { SetProperty(ref colordefaultback, value); }
        }

        //기본 색상 추후 커스텀 색상 파일로 저장 후 로드
        private Dictionary<string, string> DirColors;
        private string nonecolor = "FF0000";

        //파일 관련 변수
        private FncFileIO fileIO = new FncFileIO();
        private string FilePath = "Setting";
        private string FileName = "Color";

        #endregion Models


        #region Event
        public delegate void EventHandler();
        public static event EventHandler ColorUpdate;

        #endregion Event


        #region Functions
        private void DefaultColors()
        {
            DirColors = new Dictionary<string, string>();
            DirColors.Add("backopacity", "66");
            DirColors.Add("bid", "DD2323");
            DirColors.Add("ask", "244993");
            DirColors.Add("text", "333333");
            DirColors.Add("back", "FFFFFF");
            DirColors.Add("defaluttext", "333333");
            DirColors.Add("defalutback", "FFFFFF");
        }
        private string ReverseColor(string color)
        {
            string val = "";
            byte R = (byte)(255 - Convert.ToByte((color[0].ToString() + color[1].ToString()), 16));
            byte G = (byte)(255 - Convert.ToByte((color[2].ToString() + color[3].ToString()), 16));
            byte B = (byte)(255 - Convert.ToByte((color[4].ToString() + color[5].ToString()), 16));
            val = $"{R:X2}{G:X2}{B:X2}";
            return val;
        }

        private void SetColors()
        {
            var bc = new BrushConverter();
            string backopacity = GetColor("backopacity");
            string bid = GetColor("bid");
            string ask = GetColor("ask");
            string text = GetColor("text");
            string back = GetColor("back");
            string defaluttext = GetColor("defaluttext");
            string defalutback = GetColor("defalutback");

            ColorBid = (Brush)bc.ConvertFrom($"#FF{bid}");
            ColorBidBack = (Brush)bc.ConvertFrom($"#{backopacity}{bid}");

            ColorAsk = (Brush)bc.ConvertFrom($"#FF{ask}");
            ColorAskBack = (Brush)bc.ConvertFrom($"#{backopacity}{ask}");

            ColorText = (Brush)bc.ConvertFrom($"#FF{text}");
            ColorBack = (Brush)bc.ConvertFrom($"#FF{back}");

            ColorBorder = (Brush)bc.ConvertFrom($"#FF{ReverseColor(back)}");

            ColorDefault = (Brush)bc.ConvertFrom($"#FF{defaluttext}");
            ColorDefaultBack = (Brush)bc.ConvertFrom($"#{backopacity}{defalutback}");


        }
        private void SaveColors()
        {
            fileIO.FileWrite<Dictionary<string, string>>(FilePath, FileName, DirColors);
        }
        private void LoadColors()
        {
            DirColors = fileIO.FileRead<Dictionary<string, string>>(FilePath,FileName);
        }
        #endregion
        public void SetTest(ref Brush chang, Brush brush)
        {
            chang = brush;
        }
        public Colors()
        {
            LoadColors();

            //읽어온 색상이 없을경우 기본설정된 컬러를 불러옴.
            if(DirColors is null)
            {
                //기존 컬러를 저장하고
                DefaultColors();

                //저장된 기본컬러를 파일로 저장.
                SaveColors();
            }

            SetColors();
        }

        public void SetColor()
        {
            SetColors();
            ColorUpdate();
        }

        /// <summary>
        /// 딕셔너리에 저장된 값을 불러옴.
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        private string GetColor(string name)
        {
            string Color = "";
            try
            {
                Color = DirColors[name];
            }
            catch (Exception e) 
            {
                Color = nonecolor;
            }

            return Color;
        }

        /// <summary>
        /// 딕셔너리에 저장된 값으 변경
        /// </summary>
        /// <param name="key"></param>
        /// <param name="color"></param>
        /// <returns></returns>
        public bool SetColor(string key,string color)
        {
            bool b = true;
            try
            {
                DirColors[key] = color;
            }
            catch (Exception e)
            {
                b = false;
            }
            return b;
        }

        /// <summary>
        /// 컬러를 등록시켜줌
        /// </summary>
        /// <param name="key"></param>
        /// <param name="color"></param>
        public void AddColor(string key, string color)
        {
            DirColors.Add(key, color);
            SaveColors();
        }

        /// <summary>
        /// DirColors에서 직접적으로 컬러값을 가져옴.
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public Brush DirGetColor(string key)
        {
            var bc = new BrushConverter();
            return (Brush)bc.ConvertFrom($"#FF{GetColor(key)}");
        }

        /// <summary>
        /// 목록 불러옴.
        /// </summary>
        /// <returns></returns>
        public Dictionary<string, string> GetColorList()
        {
            return DirColors;
        }
    }
}

 

 

 

색정보 저장 및 로드

private void SaveColors()
{
    fileIO.FileWrite<Dictionary<string, string>>(FilePath, FileName, DirColors);
}
private void LoadColors()
{
    DirColors = fileIO.FileRead<Dictionary<string, string>>(FilePath,FileName);
}

기존에 만들어두었던 FileIO를 사용했습니다.

 

 

컬러 등록 및 목록

/// <summary>
/// 컬러를 등록시켜줌
/// </summary>
/// <param name="key"></param>
/// <param name="color"></param>
public void AddColor(string key, string color)
{
    DirColors.Add(key, color);
    SaveColors();
}

/// <summary>
/// 목록 불러옴.
/// </summary>
/// <returns></returns>
public Dictionary<string, string> GetColorList()
{
    return DirColors;
}

현재 사용은 안하고 나중에 사용하기 위해 만들어둠.

 

 

색 변경

/// <summary>
/// 딕셔너리에 저장된 값으 변경
/// </summary>
/// <param name="key"></param>
/// <param name="color"></param>
/// <returns></returns>
public bool SetColor(string key,string color)
{
    bool b = true;
    try
    {
        DirColors[key] = color;
    }
    catch (Exception e)
    {
        b = false;
    }
    return b;
}

DirColors에 해당 키값이 있을경우 색상을 변경한다.

변경 후 꼭 SetColor() 함수를 호출해줘야함. 그래야 UI쪽에 색상들을 변경시키는 이벤트를 발생시킴.

 

 

색 코드 얻기

/// <summary>
/// 딕셔너리에 저장된 값을 불러옴.
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
private string GetColor(string name)
{
    string Color = "";
    try
    {
        Color = DirColors[name];
    }
    catch (Exception e) 
    {
        Color = nonecolor;
    }

    return Color;
}

DirColors에 등록된 색상값을 Key값을 통해 색상 코드얻어옴. 해당 색상코드를 Brush로 변경해주는 작업을 해줘야함.

반응형