Задать вопрос
@romaro

Как переопределить стиль WPF-компонентов из подключенной библиотеки?

Допустим, у меня есть две библиотеки LibControls и LibForms, а также приложение MyApp. LibControls содержит компоненты и базовые стили для них. LibForms и MyApp используют компоненты из LibControls.

Если для MyApp понадобится кастомный дизайн кнопки, мне достаточно описать новый стиль и подключить его к нужным кнопкам (Style={RelativeSource buttonStyleFromMyApp}). Однако кнопки, которые используются на формах подключенной к приложению библиотеки LibForms, останутся с прежним дизайном, ведь там жестко прописан Style={RelativeSource buttonStyleFromLibControls}.

Но можно использовать не именованные стили (без x:Key). Такие стили будут применяться ко всем компонентам, которые метчатся на TargetType. Это позволит перекрыть базовый стиль кнопок, который определен в LibControls. Обратной стороной будет необходимость создавать кастомные компоненты на каждый тип кнопок. Например, если дизайн кнопки "Ок" должен отличаться от дизайна кнопки "Отмена", потребуется определить 2 наследника класса Button: CancelButton и OkButton. Так у Button могут получиться десятки наследников.

Вопрос: это единственный способ добиться возможности переопределять стили подключенных UI-библиотек из приложения?
  • Вопрос задан
  • 75 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Stepik
    PRO C#. Профессия "Backend разработчик"
    4 месяца
    Далее
  • Merion Academy
    C# разработчик с нуля
    4 месяца
    Далее
  • Skillfactory
    Профессия C#-разработчик
    12 месяцев
    Далее
Решения вопроса 1
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
    Задание стилей через установку свойства TargetType и создание наследника класса — самый простой и удобный способ. Если у вас несколько вариантов стилей одной и той же кнопки — сделайте базовый стиль и базовую кнопку, а вариации стилей через свойства задайте. Тогда и не нужно будет создавать несколько классов одной и той же кнопки. Дополнительные классы нужны для использования дополнительных свойств только. И это нормально, когда у вас есть какие-то компоненты с базовыми свойствами и несколько их наследников с дополнительными. Можно, конечно, в рантайме в коде вертеть как угодно стилями, но в WPF традиционен подход в виде шаблона MVVP и вот так в коде всем вертеть будет не очень удобно. Такой подход используется в случаях сложных или нестандартных контролов.

Пример из реальной жизни
    Вот тут определены две кнопки — IconButton и TabButton как расширение стандартного класса Button. Так же у них определены свои собственные одноимённые стили. И далее в коде используются обе эти кнопки, при этом у них есть как общий базовый стиль, так и добавленные свойства типа иконки или заголовка вкладки, которые и используются в XAML разметке. При этом, т.к. они имеют общего предка, можно легко добавить стиль для класса Button и поменять базовый стиль сразу для всех наследников, не затрагивая дополнительные стили самих наследников.
    Пример элементов, когда некоторая часть стилей и их поведение задаётся в коде: GridTable — решение проблем размеров и позиционирования контента в табличном представлении на базе простой Grid (очень, очень рекомендую для замены DataGrid, т.к. там очень плохо с адекватным размещением и позиционированием контента); ComboBoxEx — исправление размеров контента в соответствии с самим элементом.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы