Статический ресурс в общих словарях - PullRequest
9 голосов
/ 01 декабря 2010

В настоящее время я работаю над наличием словарей стилей и шаблонов, которые я могу динамически применять к своему приложению. До этого динамического поведения «новый разыскиваемый» у меня было несколько словарей ресурсов, по одному для каждого стилизованного элемента управления, которые я слил в App.xaml:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ColorsDictionary.xaml"/>
            <ResourceDictionary Source="ControlsTemplatesDictionary.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

Теперь я бы хотел, чтобы мое приложение было стилизовано, поэтому я решил объединить все мои предыдущие ресурсы в новый, называемый "MyFirstTemplates", и добавить только этот словарь в App.xaml.

Новый словарь "MyFirstTemplates.xaml":

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">"
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="ColorsDictionary.xaml"/>
        <ResourceDictionary Source="ControlsTemplatesDictionary.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

Новое приложение. Xaml:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="MyFirstTemplates.xaml"/>
        </ResourceDictionary.MergedDictionaries>
        <Style TargetType="{x:Type Window}"/>
    </ResourceDictionary>
</Application.Resources>

Примечание. Стиль по умолчанию для окна - исправить ошибку в WPF 4, см. Добавление объединенного словаря в объединенный словарь

Теперь, когда я сделал это изменение, я больше не могу использовать цветовой ресурс из "ColorsDictionary.xaml" в качестве StaticResource в "ControlsTemplateDictionary.xaml". Если я вернусь к объединению этих файлов в app.xaml, все будет работать. Чтобы это работало, я должен изменить эти StaticResource на DynamicResource . У вас есть идеи, почему это больше не работает?

Спасибо: -)

Ответы [ 2 ]

9 голосов
/ 01 декабря 2010

При перемещении словарей из App.xaml ресурсы из каждого словаря не попадают в дерево ресурсов другого во время загрузки MyFirstTemplates.xaml.Ваша первоначальная установка сначала загрузила ColorsDictionary, который затем был доступен через ресурсы приложения для ControlsTemplatesDictionary во время загрузки.В новой настройке для того, чтобы ресурс цвета был доступен в ресурсах приложения, его необходимо загрузить через MyFirstTemplates, что, в свою очередь, требует загрузки обоих словарей, что, в свою очередь, требует доступа к ресурсу цвета ... так что это своего родабесконечный цикл ссылок, который не может быть разрешен статически.DynamicResource может подождать, пока все загрузится, и затем получить доступ к цвету без проблем.

Чтобы исправить, используйте Dynamic или объедините ColorsDictionary непосредственно с ControlsTemplatesDictionary.

2 голосов
/ 22 января 2017

Отличный ответ Джона, объясняющего, почему это происходит. Таким образом, проблема заключается в том, что при использовании объединенных словарей в объединенном словаре внутренние словари не могут «использовать» друг друга как StaticResource.

Основные решения:

  • Использовать DynamicResource
  • Используйте только один уровень иерархии из App.xaml при использовании StaticResource

Оба эти решения имеют проблемы. DynamicResource имеет проблемы с производительностью. Второе решение ограничивает вашу организацию ресурсов XAML.

Альтернативное решение:

Я создал небольшую простую программу (приведенную ниже в GitHub), которая будет запускаться как событие перед сборкой и объединять файлы XAML из папки в один длинный файл .XAML. Ну, они должны быть с другим расширением (.txaml), иначе они будут скомпилированы.

Это позволяет структурировать папки и файлы ресурсов так, как вы хотите, без ограничений WPF. StaticResource и дизайнер будут работать всегда.

Код в GitHub содержит простое решение, содержащее программу слияния. Он объединяет 2 папки в 2 файла. Один для ресурсов App.xaml, а другой для ресурсов Generic.xaml. Файлы .xaml в проекте «Элементы управления» (есть также проект «Основной»).

Сообщение в блоге, объясняющее это

...