Спустя чуть больше полумесяца упорного(упоротого) изучения основ C# и прочей литературы, вспомнил про контроллер цветовой схемы - ссылка выше. Посмотрел и тоже как и предыдущие товарищи, принимавшие участие в критике , пришел к выводу что сделано через ж. На работе решил переписать исходя из новых знаний. Но на работе Unity не поставить , кое как получилось VS Community. Часа за 2 написал контроллер для WindowsForm и удивился полученному результату - получилось грамотно(может не очень грамотно с точки зрения профессионального программиста, но я порадовался ). Дома решил переписать имеющийся на Юнити и чето впал в ступор(или устал). То что хочу - написано после кода для WinForms
Собственно код для WinForms:
Синтаксис:
Используется csharp
using System.Windows.Forms;
namespace Theme
{
public partial class MyButton : UserControl
{
public MyButton()
{
InitializeComponent();
///берем тип контрола из темы (UIThem)
var type = UITheme.button;
/// регистрируемся в контроллере и получаем свою тему
UIThemeController.Registration(this, type);
}
}
namespace Theme
{
public partial class MyButton : UserControl
{
public MyButton()
{
InitializeComponent();
///берем тип контрола из темы (UIThem)
var type = UITheme.button;
/// регистрируемся в контроллере и получаем свою тему
UIThemeController.Registration(this, type);
}
}
класс темы:
Синтаксис:
Используется csharp
using System.Drawing;
using System.Windows.Forms;
namespace Theme
{
/// <summary>
/// для связки при добавлении в словарь по обобщенному интерфесу + применение темы
/// </summary>
interface ITheme
{
void ApplyTheme(Control control);
}
class UITheme
{
/// <summary>
/// текущая тема, задается из UIThemeController
/// </summary>
public static UIThemeColor currUIThemeColor;
public enum UIThemeColor
{
Black,
White
}
/// <summary>
/// для использования контролами при регистрации себя в качестве выбора типа класса темы контрола
/// </summary>
public static ButtonTheme button = new ButtonTheme();
public static TextBoxTheme textbox = new TextBoxTheme();
public class ButtonTheme : ITheme
{
Color[] backcolor = new Color[]
{
Color.Black,
Color.White
};
public void ApplyTheme(Control control)
{
///цвет соответсвенно теме
control.BackColor = backcolor[(int)UITheme.currUIThemeColor];
}
}
public class TextBoxTheme : ITheme
{
Color[] foreColor = new Color[]
{
Color.Black,
Color.White
};
public void ApplyTheme(Control control)
{
control.ForeColor = foreColor[(int)UITheme.currUIThemeColor];
}
}
/// дальше остальные классы тем контролов с реализацией : ITheme
}
}
using System.Windows.Forms;
namespace Theme
{
/// <summary>
/// для связки при добавлении в словарь по обобщенному интерфесу + применение темы
/// </summary>
interface ITheme
{
void ApplyTheme(Control control);
}
class UITheme
{
/// <summary>
/// текущая тема, задается из UIThemeController
/// </summary>
public static UIThemeColor currUIThemeColor;
public enum UIThemeColor
{
Black,
White
}
/// <summary>
/// для использования контролами при регистрации себя в качестве выбора типа класса темы контрола
/// </summary>
public static ButtonTheme button = new ButtonTheme();
public static TextBoxTheme textbox = new TextBoxTheme();
public class ButtonTheme : ITheme
{
Color[] backcolor = new Color[]
{
Color.Black,
Color.White
};
public void ApplyTheme(Control control)
{
///цвет соответсвенно теме
control.BackColor = backcolor[(int)UITheme.currUIThemeColor];
}
}
public class TextBoxTheme : ITheme
{
Color[] foreColor = new Color[]
{
Color.Black,
Color.White
};
public void ApplyTheme(Control control)
{
control.ForeColor = foreColor[(int)UITheme.currUIThemeColor];
}
}
/// дальше остальные классы тем контролов с реализацией : ITheme
}
}
сам контроллер:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using System.Windows.Forms;
namespace Theme
{
class UIThemeController
{
public UIThemeController()
{
UITheme.currUIThemeColor = UITheme.UIThemeColor.Black;
}
static Dictionary<ITheme, IList> ControlsDictionary = new Dictionary<ITheme, IList>();
/// <param name="control"></param> -- control itself,собственно сам конрол
/// <param name="typeObject"></param> -- object to recognize class , объект только для того, что бы передать класс темы контрола
public static void Registration (Control control,ITheme typeObject)
{
/// если в словаре зарегистрирован тип класса темы контрола
if (ControlsDictionary.ContainsKey(typeObject))
{
///и если его нет в списке по ключу класса темы то добавляем
if (!ControlsDictionary[typeObject].Contains(control))
ControlsDictionary[typeObject].Add(control);
}
else
{
/// если тип класса темы не зарегитрирован - создаем список, добавляем контрол, добавляем в словарь
List<Control> myList = new List<Control> { control };
ControlsDictionary.Add(typeObject, myList);
}
/// ну и применяем тему
typeObject.ApplyTheme(control);
}
}
}
using System.Collections.Generic;
using System.Windows.Forms;
namespace Theme
{
class UIThemeController
{
public UIThemeController()
{
UITheme.currUIThemeColor = UITheme.UIThemeColor.Black;
}
static Dictionary<ITheme, IList> ControlsDictionary = new Dictionary<ITheme, IList>();
/// <param name="control"></param> -- control itself,собственно сам конрол
/// <param name="typeObject"></param> -- object to recognize class , объект только для того, что бы передать класс темы контрола
public static void Registration (Control control,ITheme typeObject)
{
/// если в словаре зарегистрирован тип класса темы контрола
if (ControlsDictionary.ContainsKey(typeObject))
{
///и если его нет в списке по ключу класса темы то добавляем
if (!ControlsDictionary[typeObject].Contains(control))
ControlsDictionary[typeObject].Add(control);
}
else
{
/// если тип класса темы не зарегитрирован - создаем список, добавляем контрол, добавляем в словарь
List<Control> myList = new List<Control> { control };
ControlsDictionary.Add(typeObject, myList);
}
/// ну и применяем тему
typeObject.ApplyTheme(control);
}
}
}
А теперь то что хочу сделать:
1. Скрипт ,что б вешать на УИ элемент, с возможностью выбора типа элемента в инспекторе , то есть
что типа
Синтаксис:
Используется csharp
/// это брать из класса тем
public enum UIElementType
{
None = 0,
FonBackColor = 1,
MainImage = 2,
LineImage=3,
HalfLineImage=4,
BtnMain=5,
NormText=6,
HalfText=7,
SliderBackGround =8,
BtnGoToBack=9,
BtnCalendar=10,
CanvasMain=11,
ImgAdd=12,
ImgDelete = 13,
ImgComment = 14,
}
/// позволяет выбрать тип в инспекторе
public UIElementType type;
//туто код регистрации в контроллере
UIThemeController.Registration(this, что - то ....);
public enum UIElementType
{
None = 0,
FonBackColor = 1,
MainImage = 2,
LineImage=3,
HalfLineImage=4,
BtnMain=5,
NormText=6,
HalfText=7,
SliderBackGround =8,
BtnGoToBack=9,
BtnCalendar=10,
CanvasMain=11,
ImgAdd=12,
ImgDelete = 13,
ImgComment = 14,
}
/// позволяет выбрать тип в инспекторе
public UIElementType type;
//туто код регистрации в контроллере
UIThemeController.Registration(this, что - то ....);
2.Это хотение второго плана - Хочу получить критику на приведенный код смены темы в WinForms, только в плане реализации контроллера (в смысле , что WinForm не интересует как среда применения, только организация независимости)