Ресурсы

33

Система ресурсов WPF представляет собой простой способ поддержания вместе набора полезных объектов, таких как наиболее часто используемые кисти, стили или шаблоны, что существенно упрощает работу с ними.

В WPF ресурсы можно определять в коде или в различных местах внутри разметки (вместе с отдельными элементами управления, внутри отдельных окон или во всем приложении).

Ресурсы обладают рядом важных преимуществ, которые перечислены ниже:

Эффективность

Ресурсы позволяют определять объект один раз и затем использовать его в нескольких местах внутри разметки. Это упрощает код и делает его намного эффективнее.

Сопровождаемостъ

Ресурсы позволяют переносить низкоуровневые детали форматирования (вроде размеров шрифтов) в центральное место, где их легко изменять. Это своего рода XAML-эквивалент создания констант в коде.

Адаптируемость

После отделения определенной информации от остальной части приложения и ее помещения в раздел ресурсов появляется возможность ее динамической модификации. Например, может понадобиться изменять детали ресурсов на основе пользовательских предпочтений или текущего языка.

Коллекция ресурсов

Каждый элемент включает свойство Resources, в котором хранится словарная коллекция ресурсов (представляющая собой экземпляр класса ResourceDictionary). Эта коллекция ресурсов может хранить объект любого типа с индексацией по строке.

Хотя каждый элемент имеет свойство Resources (которое определено в классе FrameworkElement), чаще всего ресурсы определяются на уровне окна. Причина в том, что каждый элемент имеет доступ к ресурсам из собственной коллекции ресурсов, а также к ресурсам из коллекции ресурсов всех своих родительских элементов.

Например, рассмотрим окно с тремя кнопками, показанное на рисунке. Две из трех кнопок используют одну и ту же кисть — кисть изображения, которая закрашивает их мозаичным узором с улыбающимися рожицами:

Окно с повторно используемой кистью

В данном случае очевидно, что у верхней и нижней кнопки должен быть одинаковый стиль. Однако не исключено, что позже может понадобиться изменить какие-то характеристики кисти изображения. По этой причине имеет смысл определить кисть в ресурсах окна и затем просто использовать ее заново необходимым образом.

Ниже показано, как это можно сделать:

<Window.Resources>
        <ImageBrush x:Key="TileBrush" TileMode="FlipX" ViewportUnits="Absolute"
                    Viewport="0 0 32 32" ImageSource="big_smile.png" Opacity="0.4"></ImageBrush>
</Window.Resources>

Детали кисти изображения здесь не особо важны. По-настоящему важную роль играет первый атрибут Key (предваряемый префиксом пространства имен х:, который обеспечивает размещение в пространстве имен XAML, а не WPF). В нем указано имя, под которым должна индексироваться кисть в коллекции Window.Resources. Использовать допускается любое имя.

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

Чтобы использовать ресурс в XAML-разметке, необходим какой-то способ, которым можно было бы на него ссылаться. Таким способом является использование расширения разметки. В действительности доступны два расширения разметки: одно предназначено для динамических ресурсов, а второе — для статических ресурсов. Статические ресурсы устанавливаются один раз, при первом создании окна. Динамические ресурсы применяются повторно в случае изменения ресурса. В рассматриваемом примере кисть изображения никогда не изменяется, поэтому статический ресурс является вполне подходящим вариантом:

Background="{StaticResource ResourceKey=TileBrush}"
Пройди тесты
Лучший чат для C# программистов