Словари ресурсов

88

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

Создание словаря ресурсов

При добавлении словаря ресурсов в приложение удостоверьтесь, что свойство Build Action установлено в Page (страница); это принимается для всех XAML-файлов. В результате словарь ресурсов скомпилируется в формат BAML и обеспечит более высокую производительность. Однако вполне допустимо установить свойство Build Action словаря ресурсов в Resource (ресурс); в этом случае он будет встраиваться в сборку, но не компилироваться. Синтаксический анализ во время выполнения тогда будет проходить медленнее.

Ниже показан пример словаря ресурсов с одним ресурсом внутри:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ImageBrush x:Key="TileBrush" TileMode="FlipX" ViewportUnits="Absolute"
                    Viewport="0 0 32 32" ImageSource="big_smile.png" Opacity="0.4"></ImageBrush>
</ResourceDictionary>

Использование словаря ресурсов

Чтобы использовать словарь ресурсов, где-нибудь в приложении его необходимо объединить с коллекцией ресурсов. Это можно делать в каком-то конкретном окне, однако чаще объединение осуществляется на уровне коллекции ресурсов приложения, как показано ниже:

<Application x:Class="WpfApplication1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Dictionary1.xaml"></ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

В приведенном коде разметки объект ResourceDictionary создается явно. Коллекция ресурсов всегда представляет собой объект ResourceDictionary, но данный случай является одним из тех, в которых эта деталь должна быть обязательно указана явно, чтобы иметь возможность также устанавливать свойство ResourceDictionary.MergedDictionaries. Если не предпринять этот шаг, значением свойства MergedDictionaries будет null.

MergedDictionaries — это коллекция объектов ResourceDictionary, которые будут использоваться для пополнения коллекции ресурсов.

Чтобы добавить собственные ресурсы и включить их в словари ресурсов, необходимо просто разместить их перед или после раздела MergedProperties.

Как упоминалось ранее, хранить ресурсы с одинаковыми именами в разных, но перекрывающихся коллекциях ресурсов вполне допустимо, однако объединять словари ресурсов, которые содержат ресурсы с одинаковыми именами — нет. При обнаружении дубликата во время компиляции приложения генерируется исключение XamlParseException.

Одна из причин применения словарей ресурсов — определение одной или нескольких многократно используемых "обложек" приложения, которые можно применять к элементам управления. Еще одна причина связана с необходимостью сохранения содержимого, которое должно быть локализовано (такого как строки сообщений об ошибках).

Пройди тесты
Лучший чат для C# программистов