Ресурсы
33WPF --- Привязка, команды и стили WPF --- Ресурсы
Система ресурсов 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}"