Помогите мне найти лучший подход к программированию - PullRequest
1 голос
/ 17 августа 2010

Мое приложение имеет набор базовых классов, производных практически от всех элементов управления пользовательского интерфейса XCombobox, XButton, XMenu и т. Д. Все эти классы имеют некоторые дополнительные функции, помимо стандартных (например, возможность сериализации)

Я используювсе эти элементы управления в моем тестовом приложении Windows.

Я хочу реализовать концепцию, аналогичную темам в моем приложении.

Пример: Скажите, если мне нужен синий фон

Iиметь открытое свойство, отображаемое во всех элементах управления, которое устанавливает для моих элементов управления (т. е. XButton и XMenu) задний цвет на синий

Я чувствую, что этот подход не работает.Завтра, если мой менеджер хочет другой стиль.Мне придется переходить к каждому элементу управления и менять фоновый рисунок один за другим ... не то, чтобы я возражал;) .... но это никогда не делает меня хорошим программистом.

Время для некоторого применения дизайнашаблон (шаблон стратегии, должен ли я сказать?)

Есть ли возможность, при которой я могу просто поменяться в одном центральном месте, и свойство будет применено ко всем моим элементам управления пользовательского интерфейса?

Если да ... Пожалуйста, помогите мне понять то же самое.Если нет ... Предложения по более лучшим идеям приветствуются.

Ответы [ 6 ]

2 голосов
/ 17 августа 2010

Определите класс, который имеет свойства для цветов (вы также можете добавить в свойствах для логотипов и т. Д.).

Тогда либо добавьте свои константы в код этого класса, либо прочитайте их из некоторого XML.

1 голос
/ 17 августа 2010

Я бы использовал для этого контейнер для внедрения зависимостей, такой как Unity , он позволит вам зарегистрировать вашу тему в одном месте и позволить всем вашим элементам управления разрешать тему в любое время.

Например, реализуйте простой интерфейс, который имеет свойства темы, которую будет использовать каждый элемент управления.

interface IXTheme {
    Color BackColor { get; }
}

Везде, где ваш элемент управления должен извлечь это, например, в OnPaintBackground, вы делаете простойвызов, чтобы получить цвет, используя CommonServiceLocator (он уже поставляется с Unity.)

protected override void OnPaintBackground(PaintEventArgs pevent)
{
    Color backColor = ServiceLocator.Current.GetInstance<IXTheme>().BackColor;
    ///...
}

Теперь вы можете создать свою тему где-то еще на основе этого интерфейса.

class XBlueTheme : IXTheme {
     Color IXTheme.BackColor { get { return Color.Blue; } }
}

Затем вы регистрируете тему в контейнере и используете контейнер для разрешения вашей формы.

IUnityContainer container = new UnityContainer()
    .RegisterType<IXTheme, XBlueTheme>();
IServiceLocator locator = new UnityServiceLocator(container);
ServiceLocator.SetLocatorProvider(() => locator);

XForm myForm = container.Resolve<XForm>();
1 голос
/ 17 августа 2010

Вы уже ответили на свой вопрос.

Определите константы для стиля в центральных свойствах и используйте эти константы стиля в ваших компонентах пользовательского интерфейса:).

0 голосов
/ 17 августа 2010

Полагаю, шаблон стратегии, который вы упомянули, подходит лучше всего. Эта книга Шаблоны дизайна головы Fisrt очень хорошо описывает эту проблему. вам нужен интерфейс, скажем, IStyle, определенный как член вашего базового класса, чтобы поведение стиля не зависело от вашего наследования управления.

0 голосов
/ 17 августа 2010

Вы можете создать что-то вроде .skin файла, предоставленного в веб-проектах .net.Или просто XML-файл подойдет;Например,

  1. Создайте файл .skin и добавьте туда свои элементы управления и определения стилей.
  2. Добавьте путь к файлу .skin в некотором открытом свойстве базового класса вашего элемента управления.
  3. Добавьте событие OnDraw, все элементы управления переопределяют и окрашивают себя в цвет, определенный в .skin.

Лучше попробуйте использовать существующий файл .skin;хотя я не уверен, как вы планируете анализировать файл .skin.

<TextBox BackColor="Red" ForeColor="Blue"/>
<Button BackColor="White" ForeColor="Green"/>
<DropDownList BackColor="Cyan" ForeColor="Pink"/>

Вы можете даже расширить файл скина, добавив свойство cssClass;и добавьте стили в соответствии с классом CSS, определенным в файле CSS.

<TextBox cssClass="TextLoginField"/>
<DropDownList cssClass="ComboLongList" />

Просто мысли вслух!Кстати, эта статья может дать вам понимание.

0 голосов
/ 17 августа 2010

Из того, что вы говорите, кажется, что если вы просто хотите изменить цвет, проще всего было бы просто сохранить цвет в переменной где-нибудь или иметь какую-то функцию инициализации, которую каждый компонент вызывает там, где Можно указать общие вещи, такие как цвет.
Кроме того, поскольку вы упомянули, что добавляете дополнительные компоненты к компонентам, вы можете использовать для этого шаблон проектирования Decorator.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...