Подтвердить что ты не робот

Добавление объединенного словаря в объединенный словарь

Кажется, я не могу добавить объединенный словарь в коллекцию объединенных словарей в 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 (закомментируйте тему .xaml и раскомментируйте два других словаря), они оба загрузятся правильно. Однако, как определяются наши ресурсы, это может означать, что загрузится немало ресурсов, а для динамической загрузки я хотел бы иметь возможность определять шаблоны.

4b9b3361

Ответ 1

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

О создании каждого объекта в 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>

Ответ 2

Ваш пример кода имеет знак двойного равенства в источнике словаря объединенного ресурса 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>

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

Ответ 3

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

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

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