Язык программирования C#9 и платформа .NET5
На этот раз в результате щелчка на кнопке Cancel цвет фона для кнопки Cancel изменяется, а цвет фона для кнопки ОК остается прежним. Причина в том, что расширение разметки
способно обнаруживать замену внутреннего объекта, указанного посредством ключа, новым объектом. Как и можно было предположить, такая возможность требует дополнительной инфраструктуры времени выполнения, так что{DynamicResource}обычно следует использовать, только если не планируется заменять объектный ресурс другим объектом во время выполнения с уведомлением всех элементов, которые задействуют данный ресурс.{StaticResource}Ресурсы уровня приложения
Когда в словаре ресурсов окна имеются объектные ресурсы, их могут потреблять все элементы этого окна, но не другие окна приложения. Решение совместно использовать объектные ресурсы в рамках приложения предусматривает их определение на уровне приложения, а не на уровне какого-то окна. В Visual Studio отсутствуют способы автоматизации такого действия, а потому необходимо просто вырезать имеющееся определение объекта кисти из области
и поместить его в областьWindows.ResourceфайлаApplication.Resources.Арр.xamlТеперь любое дополнительное окно или элемент управления в приложении в состоянии работать с данным объектом кисти. Ресурсы уровня приложения доступны для выбора при установке свойства
элемента управления (рис. 27.5).BackgroundНа заметку! Помещение ресурса на уровень приложения и назначение его свойству элемента управления приводит к замораживанию ресурса, что препятствует изменению значений во время выполнения. Ресурс можно клонировать и модифицировать клон.
Определение объединенных словарей ресурсов
Ресурсов уровня приложения часто оказывается вполне достаточно, но они ничем не помогут, если ресурсы необходимо разделять между проектами. В таком случае понадобится определить то, что известно как объединенный словарь ресурсов. Считайте его библиотекой классов для ресурсов WPF; он представляет собой всего лишь файл
, содержащий коллекцию ресурсов. Единственный проект может иметь любое требуемое количество таких файлов (один для кистей, один для анимации и т.д.), каждый из которых может быть добавлен в диалоговом окне Add New Item (Добавление нового элемента), открываемом через меню Project (рис. 27.6)..xamlВырежьте текущие ресурсы из области определения
в новом файлеApplication.Resourcesи перенесите их в словарь:МуBrushes.xaml<ResourceDictionary xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:local="clr-namespace:ObjectResourcesApp"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><RadialGradientBrush x:Key="myBrush"><GradientStop Color="#FFC44EC4" Offset="0" /><GradientStop Color="#FF829CEB" Offset="1" /><GradientStop Color="#FF793879" Offset="0.669" /></RadialGradientBrush></ResourceDictionary>Хотя данный словарь ресурсов является частью проекта, все словари ресурсов должны быть объединены (обычно на уровне приложения) в единый словарь ресурсов, чтобы их можно было использовать. Для этого применяется следующий формат в файле
(обратите внимание, что множество словарей ресурсов объединяются за счет добавления элементовАрр.xamlв областьResourceDictionary):ResourceDictionary.MergedDictionaries<Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="MyBrushes.xaml"/></ResourceDictionary.MergedDictionaries></ResourceDictionary></Application.Resources>Проблема такого подхода в том, что каждый файл ресурсов потребуется добавлять в каждый проект, нуждающийся в ресурсах. Более удачный подход к разделению ресурсов заключается в определении библиотеки классов .NET Core для совместного использования проектами, чем мы и займемся.
Определение сборки, включающей только ресурсы
Самый легкий способ построения сборки из одних ресурсов предусматривает создание проекта WPF User Control Library (.NET Core) (Библиотека пользовательских элементов управления WPF (.NETCore)). Создайте такой проект (по имени
) в текущем решении,выбрав пункт меню Add►New Project (Добавить►Новый проект) в Visual Studio, и добавьте ссылку на него в проектMyBrushesLibrary.ObjectResourcesAppТеперь удалите файл
из проекта. Перетащите файлUserControll.xamlв проектMyBrushes.xamlи удалите его из проектаMyBrushesLibrary. Наконец, откройте файлObjectResourcesAppв проектеMyBrushes.xamlи измените пространство именMyBrushesLibraryнах:local. Вот как должно выглядеть содержимое файлаclr-namespace:MyBrushesLibrary:MyBrushes.xaml<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:MyBrushesLibrary"><RadialGradientBrush x:Key="myBrush"><GradientStop Color="#FFC44EC4" Offset="0" />

