Почему стили не работают во время выполнения в wpf при использовании нескольких MergedDictionaries? - PullRequest
4 голосов
/ 20 февраля 2011

Если я использую MergedDictionaries несколько раз для определения стилей, он не работает во время выполнения, но в WPF Designer VS2010 он работает.Это также работает, если загружать MergedDictionaries с использованием кода во время выполнения.

Почему это происходит?Это моя проблема только или?И как это решить?

I am using WPF4 and loading themes/styles from an assembly at application level.

Не работает

<!--Application.xaml-->
 <Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/Lib;component/Themes/Theme.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>


<!--Theme.xaml-->
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Theme/Shared.xaml" />
    <ResourceDictionary Source="Theme/Button.xaml" />
</ResourceDictionary.MergedDictionaries>

Рабочая

<Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/Lib;component/Themes/Theme/Shared.xaml" />
                <ResourceDictionary Source="pack://application:,,,/Lib;component/Themes/Theme/Button.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

1 Ответ

9 голосов
/ 20 февраля 2011

См. Ответ на этот вопрос .У меня такое чувство, что у вас та же проблема

Это ошибка оптимизации, см. эту ссылку

О создании каждого объекта в XAML,если присутствует стиль по умолчанию (т. е. стиль с ключом Type), этот стиль следует применять.Как вы можете себе представить, есть несколько оптимизаций производительности, чтобы сделать этот (подразумеваемый) поиск как можно более легким.Одним из них является то, что мы не заглядываем в словари ресурсов, если они не помечены как «содержащие стили по умолчанию».Существует ошибка: если все ваши стили по умолчанию вложены в объединенные словари на три уровня глубиной (или глубже), верхний словарь не помечается, поэтому поиск пропускает его.Обходной путь - поместить стиль по умолчанию во что-либо, что угодно, в корневой словарь.

Так что добавление фиктивного стиля в корневой словарь исправляет это.Пример

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/Lib;component/Themes/Theme.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <!-- Dummy Style, anything you won't use goes -->
        <Style TargetType="{x:Type Rectangle}" />
    </ResourceDictionary>
</Application.Resources>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...