Добавление объединенного словаря в объединенный словарь - PullRequest
21 голосов
/ 06 августа 2010

Кажется, я не могу добавить объединенный словарь в коллекцию объединенных словарей в XAML.

Theme.xaml

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/Mine;component/Themes/Palette.Blue.xaml"/>
    <ResourceDictionary Source="/Mine;component/Themes/Template.xaml"/>
</ResourceDictionary.MergedDictionaries>

Ресурсы приложений

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Mine;component/Themes/Theme.xaml"/> 
            <!--
            <ResourceDictionary Source=="/Mine;component/Themes/Palette.Blue.xaml"/>
            <ResourceDictionary Source="/Mine;component/Themes/Template.xaml"/>
            -->
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

Примечание: если я поместил оба ResourceDictionaries в Appication.Resources MergedDictionary (закомментируйте theme.xaml и раскомментируйте два других словаря), они оба загрузятся правильно. Однако способ определения наших ресурсов может означать, что будет загружено довольно много ресурсов, и для динамической загрузки я хотел бы иметь возможность определять шаблоны.

Ответы [ 3 ]

35 голосов
/ 06 ноября 2010

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

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

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

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Mine;component/Themes/Theme.xaml"/>
        </ResourceDictionary.MergedDictionaries>
        <!-- Dummy Style, anything you won't use goes -->
        <Style TargetType="{x:Type Rectangle}" />
    </ResourceDictionary>
</Application.Resources>
0 голосов
/ 23 сентября 2016

Если это происходит на одном из ваших собственных элементов управления, я обнаружил, что другое решение устанавливает для свойства DefaultStyleKey значение null:

DefaultStyleKeyProperty.OverrideMetadata(typeof(MyControl), new FrameworkPropertyMetadata(null));

Я понятия не имею, почему это работает, но, похоже,к!

0 голосов
/ 12 августа 2010

Ваш пример кода имеет двойной знак равенства в источнике словаря объединенных ресурсов App.xaml для Palette.Blue.xaml.Я предполагаю, что это опечатка для вашего примера, опубликованного здесь, а не ваша настоящая проблема.

Может быть сложно выяснить, как связать все ресурсы напрямую в XAML.Самый простой способ сделать это с панели ресурсов в Blend.Я создал приложение Silverlight с файлами ресурсов, названными как ваш пример, затем открыл проект в Blend и очень быстро связал их вместе.

App.xaml

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="SilverlightApplication1.App">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Theme.xaml" />
                <!--
                <ResourceDictionary Source="Palette.Blue.xaml"/>
                <ResourceDictionary Source="Template.xaml"/>
                -->
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

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="Palette.Blue.xaml"/>
        <ResourceDictionary Source="Template.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

Template.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="TextBox">
        <Setter Property="Margin" Value="10" />
        <Setter Property="Width" Value="250" />
    </Style>
    <Style x:Key="ReadOnlyTextBoxStyle" TargetType="TextBox">
        <Setter Property="IsReadOnly" Value="True" />
        <Setter Property="Foreground" Value="Black" />
        <Setter Property="IsTabStop" Value="False" />
        <Setter Property="Margin" Value="10" />
        <Setter Property="Width" Value="250" />
    </Style>
</ResourceDictionary>

Palette.Blue.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <SolidColorBrush x:Key="BlueSolidColorBrush" Color="SkyBlue" />
</ResourceDictionary>

MainPage.xaml

<UserControl x:Class="SilverlightApplication1.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel x:Name="LayoutRoot" Background="Honeydew">
        <TextBox Text="Read Only Textbox"
                 Style="{StaticResource ReadOnlyTextBoxStyle}" />
        <TextBox Text="Blue Textbox"
                 Background="{StaticResource BlueSolidColorBrush}" />
        <TextBox Text="Read Only, Blue Textbox"
                 Style="{StaticResource ReadOnlyTextBoxStyle}"
                 Background="{StaticResource BlueSolidColorBrush}" />
    </StackPanel>
</UserControl>

Конечно, если вы связываете ресурсы из разных сборок, это будет выглядеть по-разному.На самом деле, в этом случае я бы посоветовал объединить ваши словари в коде позади.

...