WPF StaticResource работает, DynamicResource нет

Я уже целый день безуспешно пытаюсь создать кучу кистей в теме, а затем использовать их с DynamicResource в пользовательском элементе управления. Я сделал следующее:

  • создайте тему generic.xaml, которая содержит стили (работы)
  • , добавьте словарь для слияния в generic. xaml для хранения кистей, используемых в приложении (работает)
  • сделать кисти иметь ключи ComponentResourceKey (работает)
  • сделать управление использовать кисти в качестве статического ресурса (работает)
  • сделать управление использовать кисти в качестве динамического ресурса (НЕ РАБОТАЕТ) источник трассировки ресурсов говорит так же: System.Windows.ResourceDictionary Предупреждение: 9: ресурс не найден;)
  • динамически добавьте в App.Resources кисть с тем же ключом (работает с динамическим ресурсом, меняет цвета, не не работает со статическим ресурсом, как и ожидалось)

Так что моя проблема в том, что я не могу найти способ определить значения по умолчанию в теме, чтобы я мог программно изменить их в приложении. Как StaticResource может найти кисть, а DynamicResource нет?!

Я должен добавить, что Мы создали статический класс, содержащий ключи ресурсов компонента в качестве свойств, которые я затем использую в xaml как {x: Static UI: ResourceScheme.ControlBackgroundKey}, например. Моя проблема похожа на эту: ComponentResourceKey как проблема DynamicResource только в том, что если я заменяю статические ключи свойств на разметку XAML для ключа ресурса компонента, он все равно не работает.

Может кто-то помочь, пожалуйста меня здесь? : ([

9
задан Community 23 May 2017 в 00:32
поделиться

2 ответа

Наконец-то исправил. Похоже, что наличие типа для ключа ресурса компонента в другой сборке вызвало всю проблему. Подведем итог:

  • существует класс ресурсов, который содержит ComponentResourceKeys как статические свойства. Тип, используемый в конструкторе ключей ресурсов, является типом этого класса. Это в сборке ресурсов.
  • существует тема для настраиваемых элементов управления в другой сборке, сборке Controls, которая определяет некоторые кисти, используя в качестве ключа свойства класса ресурсов: {x: Static Namespace: ResourceClass.ResourceKeyProperty}
  • в той же теме шаблоны для элементов управления используют кисти как динамические ресурсы: {DynamicResource {x: Static Namespace: ResourceClass.ResourceKeyProperty}}
  • также существует приложение, которое использует эти элементы управления и динамически добавляет пользовательские кисти в ресурсы приложения. Эти кисти имеют те же ключи, что и в теме.

Конечный результат для этого:

  • элементы управления изначально не используют кисти
  • элементы управления действительно используют кисти, добавленные в ресурсы приложения
  • элементы управления изначально используют кисти, если StaticResource используется в тема, но тогда ресурсы приложения игнорируются

Решением этой проблемы может быть перемещение класса ресурсов в библиотеку элементов управления.

Поскольку я до сих пор не знаю, почему это происходит, этот вопрос остается открытым, даже если он немного изменен: почему он не работает в первом сценарии?

5
ответ дан 3 November 2019 в 01:52
поделиться

Вот разница,

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

Таким образом, статический ресурс в случае пользовательского элемента управления должен быть определен только над определением элемента управления в том же файле generic.xaml. Поэтому, если вы поместите свои кисти в другой xaml, это точно не сработает в случае статического ресурса.

По этой причине, если другие ресурсы типа xaml не включены в виде какого-либо импорта во время компиляции в том же файле, вы не можете использовать статический ресурс в файле. Это просто означает, что фактический xaml файла/компонента/элемента управления каким-то образом должен содержать фактическую ссылку на статический ресурс, который вы используете.

Теперь у меня есть сомнения, почему DynamicResource не будет работать, потому что, вероятно, DynamicResource будет искать только в ResourceDictionary Приложения (где используется элемент управления), но не в generic.xaml.

Я не уверен на 100%, но мне кажется, что если вы определяете настраиваемый элемент управления и используете DynamicResource, то ваши ресурсы должны находиться в словаре ресурсов приложения или в родительском контейнере словаря ресурсов вашего элемента управления, но это не может быть в универсальный.xaml.

Поскольку DynamicResource будет искать ключи только в логическом дереве среды выполнения элемента управления, и поэтому он может не найти ресурсы, которые находятся в generic.xaml, если только generic.xaml явно не добавлен в Application.Resources.

Резюме: StaticResource должен быть лексически доступен в том же файле во время компиляции, ресурсы будут доступны в словаре Application.Resources, его можно найти в логическом дереве, но во время компиляции только в той же dll или в том же generic.xaml.

DynamicResource необходимо искать в Application.Resources и в логическом дереве элемента управления во время выполнения.

Дополнительные сведения см. в Обзоре ресурсов

4
ответ дан 3 November 2019 в 01:52
поделиться
Другие вопросы по тегам:

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