На заметку! Помещение ресурса на уровень приложения и назначение его свойству элемента управления приводит к замораживанию ресурса, что препятствует изменению значений во время выполнения. Ресурс можно клонировать и модифицировать клон.
Определение объединенных словарей ресурсов
Ресурсов уровня приложения часто оказывается вполне достаточно, но они ничем не помогут, если ресурсы необходимо разделять между проектами. В таком случае понадобится определить то, что известно как .xaml
, содержащий коллекцию ресурсов. Единственный проект может иметь любое требуемое количество таких файлов (один для кистей, один для анимации и т.д.), каждый из которых может быть добавлен в диалоговом окне Add New Item (Добавление нового элемента), открываемом через меню Project (рис. 27.6).
Вырежьте текущие ресурсы из области определения Application.Resources
в новом файле МуBrushes.xaml
и перенесите их в словарь:
xmlns:local="clr-namespace:ObjectResourcesApp"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
Хотя данный словарь ресурсов является частью проекта, все словари ресурсов должны быть объединены (обычно на уровне приложения) в единый словарь ресурсов, чтобы их можно было использовать. Для этого применяется следующий формат в файле Арр.xaml
(обратите внимание, что множество словарей ресурсов объединяются за счет добавления элементов ResourceDictionary
в область ResourceDictionary.MergedDictionaries
):
Проблема такого подхода в том, что каждый файл ресурсов потребуется добавлять в каждый проект, нуждающийся в ресурсах. Более удачный подход к разделению ресурсов заключается в определении библиотеки классов .NET Core для совместного использования проектами, чем мы и займемся.
Определение сборки, включающей только ресурсы
Самый легкий способ построения сборки из одних ресурсов предусматривает создание проекта WPF User Control Library (.NET Core) (Библиотека пользовательских элементов управления WPF (.NETCore)). Создайте такой проект (по имени MyBrushesLibrary
) в текущем решении,выбрав пункт меню Add►New Project (Добавить►Новый проект) в Visual Studio, и добавьте ссылку на него в проект ObjectResourcesApp
.
Теперь удалите файл UserControll.xaml
из проекта. Перетащите файл MyBrushes.xaml
в проект MyBrushesLibrary
и удалите его из проекта ObjectResourcesApp
. Наконец, откройте файл MyBrushes.xaml
в проекте MyBrushesLibrary
и измените пространство имен х:local
на clr-namespace:MyBrushesLibrary
. Вот как должно выглядеть содержимое файла MyBrushes.xaml
:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyBrushesLibrary">
Скомпилируйте проект WPF User Control Library. Объедините имеющиеся двоичные ресурсы со словарем ресурсов уровня приложения из проекта ObjectResourcesApp
. Однако такое действие требует использования довольно забавного синтаксиса:
Имейте в виду, что данная строка чувствительна к пробелам. Если возле символов двоеточия или косой черты будут присутствовать лишние пробелы, то возникнут ошибки времени выполнения. Первая часть строки представляет собой дружественное имя внешней библиотеки (без файлового расширения). После двоеточия идет слово Component
, а за ним имя скомпилированного двоичного ресурса, которое будет идентичным имени исходного словаря ресурсов XAML.
На этом знакомство с системой управления ресурсами WPF завершено. Описанные здесь приемы придется часто применять в большинстве разрабатываемых приложений (а то и во всех). Теперь давайте займемся исследованием встроенного API-интерфейса анимации WPF.
Службы анимации WPF
В дополнение к службам графической визуализации, которые рассматривались в главе 26, инфраструктура WPF предлагает API-интерфейс для поддержки служб анимации. Встретив термин