|
3 / 3 / 0
Регистрация: 12.09.2016
Сообщений: 116
|
|
WPF Как переопределить стиль компонентов из подключенных библиотек?02.03.2026, 10:50. Показов 707. Ответов 16
Коллеги, вопрос по применению стилей. Допустим, у меня есть две библиотеки 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-библиотек из приложения?
0
|
|
| 02.03.2026, 10:50 | |
|
Ответы с готовыми решениями:
16
Переопределить стиль
Меняем стиль элементов управления на свой стиль |
|
9 / 7 / 2
Регистрация: 26.08.2025
Сообщений: 17
|
||
| 02.03.2026, 14:27 | ||
|
Таким образом все зависит от организации словарей. Не важно как он определен, TargetType или x:Key - главное чтоб он был подключен к корню в App.xaml Его можно динамически менять через удаление и подстановку в MergedDictionaries. Общего случая здесь нет - надо конкретно смотреть разделена ли компоновка и свойства стиля. Если все в одной куче, тогда надо все переделать, а если разделены, то словари со свойствами можно подменить на свои.
1
|
||
|
Модератор
|
|||||
| 02.03.2026, 19:37 | |||||
|
Есть гораздо более хитрые способы. 1) Если в стиле кнопок не используете Content, то можно в него записывать какие-то значения, от которых будет зависеть стиль кнопоки. 2) Можно создать AP-свойство для кастомизации стиля. В простейшем случае, достаточно string типа и статического класса со стринг константами. Но в большинстве случаев хватает простейшего DynamicResource иногда в тандеме с ComponentResourceKey. Например, как одним базовым стилем поменять визуал не только дефолтных кнопок, но и кастомизированных? К сожалению "волшебной палочки", для создания решения на все случаи жизни, нет. Надо сначала определить с тем, что хочется получить в результате. Если очень продвинуто делать, то нужно внедрять управление темами.
0
|
|||||
|
3 / 3 / 0
Регистрация: 12.09.2016
Сообщений: 116
|
||||||
| 02.03.2026, 21:06 [ТС] | ||||||
|
Рад, что вы не забросили форум
![]() Мне не до конца понятно, как лучше работать со стилями в wpf-библиотеке, которая не содержит App.xaml (т.е. является подключаемой). Если использовать только Button и прописывать для него style, то придется подключать словарь с дефолтными стилями в каждый xaml, где используется условная кнопка. И, если не ошибаюсь, у такого подключенного стиля будет приоритет над стилями из App.xaml. В итоге библиотечные компоненты не получат стиль приложения. 1. Примененять темы ко всем компонентам приложения, в том числе из подключенных библиотек 2. Переопределять стиль отдельных элементов из приложения Добавлено через 28 минут
0
|
||||||
|
|
|||
| 02.03.2026, 21:18 | |||
|
На стилях, которые только таргетированы под конкретные контролы - далеко не уедешь.. Вы по существу вопроса вроде много написали, однако конкретики никакой практически.. Что в итоге нужно не ясно.
0
|
|||
|
3 / 3 / 0
Регистрация: 12.09.2016
Сообщений: 116
|
||||||
| 02.03.2026, 21:26 [ТС] | ||||||
|
Если все-таки работать с именованными стилями и обходиться минимумом кастомных компонентов (либо вообще без них), то вопрос сводится к тому, как добавить словарь темы в глобальную область видимости, а не подключать к ресурсу каждого Window/UserControl (у меня без этого не получается ссылаться на конкретный стиль в свойстве Style).
Пока нагуглил два варианта: 1. Использовать Themes/Generic 2. В подключаемых библиотеках использовать StyledUserControl и StyledWindow и уже как-то забирать стиль из приложения ( что создаст неявную зависимость):
0
|
||||||
|
|
|||||||
| 02.03.2026, 21:31 | |||||||
|
Например, если стили в этом же проекте:
0
|
|||||||
|
3 / 3 / 0
Регистрация: 12.09.2016
Сообщений: 116
|
|||||||
| 02.03.2026, 22:25 [ТС] | |||||||
0
|
|||||||
|
|
|||
| 02.03.2026, 22:48 | |||
|
Причем здесь UserControl?
Конечный стиль элемента определяется разметкой. Таргетированные стили работают по принципу "пузырька", т.е. все что не переопределено - наследуется из базового (родительского) стиля, т.е. как бы "всплывает" наверх. По мне, так это какая-то утопия.. Или вы чего-то не понимаете фундаментального.. Добавлено через 6 минут Я вообще делал так: в отдельной библиотеке находятся все цветовые гаммы вместе со стилями конкретных контролов. В другой библиотеке, которая имеет прямую ссылку на первую - созданы Темы. В каждой Теме описана конфигурация цветов и контролов из первой библиотеки. В проект подключается библиотека "Темы". Как итог, приложение имеет в своем распоряжении несколько Тем. Путем изменения Тем - элементы окон тут же изменяются на описанные в этой библиотеке..
0
|
|||
|
Модератор
|
||
| 02.03.2026, 23:10 | ||
|
Два варианта: 1) Который я сам использовал: создаёте проект типа "Приложение WPF", но компилите его в DLL сборку. Можно и в exe - это тоже мешать не будет. В режиме разработки будут использовать стили из App библы. В режиме рантайм из App приложения. Так как библа всё равно будет использоваться только в WPF приложениях, то лишних зависимостей такой способ тоже не создаст. 2) Подключаете нужные ресурсные словари в XAML контролов. Так как словари известны, то в конструкторе Code Behind удаляете их. Инициализация словарей происходит в методе InitializeComponent(). Поэтому удаление должно быть после его вызова. Для DynamicResource это сработает прекрасно. Но если есть StaticResource, то начнутся "танцы с бубном".
1
|
||
|
3 / 3 / 0
Регистрация: 12.09.2016
Сообщений: 116
|
||
| 02.03.2026, 23:48 [ТС] | ||
|
0
|
||
|
Модератор
|
|||
| 03.03.2026, 00:40 | |||
|
Да и более прозрачно и предсказуемо мне показалось сделать с App. Добавлено через 1 минуту
0
|
|||
|
3 / 3 / 0
Регистрация: 12.09.2016
Сообщений: 116
|
||||||||||||
| 03.03.2026, 01:18 [ТС] | ||||||||||||
|
1) Создал приложение как подключаемую библиотеку и добавил к ней словарь со стилем кнопки:
Точно такой же словарь с таким же стиле для кнопки добавил в само приложение (разница только в цвете кнопки):
Но после запуска приложения кнопка не использует ни стиль из WpfDemo, ни из MyApp. Добавлено через 4 минуты При этом, что интересно, в дизайнере MyApp кнопка из подключенного компонента получает стиль, подключенный к приложению. Т.е. работает как надо.
0
|
||||||||||||
|
Модератор
|
|||||||
| 03.03.2026, 11:28 | |||||||
|
Скорее всего это будет:
Если не получится самому разобраться, то скиньте Решение целиком. Я посмотрю вечером.
1
|
|||||||
|
3 / 3 / 0
Регистрация: 12.09.2016
Сообщений: 116
|
|||||||
| 04.03.2026, 02:22 [ТС] | |||||||
0
|
|||||||
|
Модератор
|
||||
| 04.03.2026, 21:09 | ||||
|
Запуск MainWindow прописывал в App WPF приложения. А в Program.Main только запускал экземпляр App. Ну, есть он и есть, а чему он мешает?
0
|
||||
| 04.03.2026, 21:09 | |
|
Помогаю со студенческими работами здесь
17
Как переопределить стандартный контрол ComboBox?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|