Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

Вырежьте текущие ресурсы из области определения

Application.Resources
в новом файле
МуBrushes.xaml
и перенесите их в словарь:

<ResourceDictionary xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation

xmlns: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)). Создайте такой проект (по имени

MyBrushesLibrary
) в текущем решении,выбрав пункт меню Add?New Project (Добавить?Новый проект) в Visual Studio, и добавьте ссылку на него в проект
ObjectResourcesApp
.

Теперь удалите файл

UserControll.xaml
из проекта. Перетащите файл
MyBrushes.xaml
в проект
MyBrushesLibrary
и удалите его из проекта
ObjectResourcesApp
. Наконец, откройте файл
MyBrushes.xaml
в проекте
MyBrushesLibrary
и измените пространство имен
х:local
на
clr-namespace:MyBrushesLibrary
. Вот как должно выглядеть содержимое файла
MyBrushes.xaml
:

<ResourceDictionary

xmlns="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" />

<GradientStop Color="#FF829CEB" Offset="1" />

<GradientStop Color="#FF793879" Offset="0.669" />

</RadialGradientBrush>

</ResourceDictionary>

Скомпилируйте

проект WPF User Control Library. Объедините имеющиеся двоичные ресурсы со словарем ресурсов уровня приложения из проекта
ObjectResourcesApp
. Однако такое действие требует использования довольно забавного синтаксиса:

<Application.Resources>

<ResourceDictionary>

<ResourceDictionary.MergedDictionaries>

<!-- Синтаксис выглядит как

/ИмяСборки;Component/ИмяФайлаХАМLвСборке.xaml -->

<ResourceDictionary Source="/MyBrushesLibrary;Component/MyBrushes.xaml"/>

</ResourceDictionary.MergedDictionaries>

</ResourceDictionary>

</Application.Resources>

Имейте в виду, что данная строка чувствительна к пробелам. Если возле символов двоеточия или косой черты будут присутствовать лишние пробелы, то возникнут ошибки времени выполнения. Первая часть строки представляет собой дружественное имя внешней библиотеки (без файлового расширения). После двоеточия идет слово

Component
, а за ним имя скомпилированного двоичного ресурса, которое будет идентичным имени исходного словаря ресурсов XAML.

На этом знакомство с системой управления ресурсами WPF завершено. Описанные здесь приемы придется часто применять в большинстве разрабатываемых приложений (а то и во всех). Теперь давайте займемся исследованием встроенного API-интерфейса анимации WPF.

Службы анимации WPF

В дополнение к службам графической визуализации, которые рассматривались в главе 26, инфраструктура WPF предлагает API-интерфейс для поддержки служб анимации. Встретив термин анимация, многим на ум приходит вращающийся логотип компании, последовательность сменяющих друг друга изображений (для создания иллюзии движения), подпрыгивающий текст на экране или программа специфического типа вроде видеоигры или мультимедийного приложения.

Наряду с тем, что API-интерфейсы анимации WPF определенно могли бы использоваться для упомянутых выше целей, анимация может применяться всякий раз, когда приложению необходимо придать особый стиль. Например, можно было бы построить анимацию для кнопки на экране, чтобы она слегка увеличивалась, когда курсор мыши находится внутри ее границ (и возвращалась к прежним размерам, когда курсор покидает границы). Или же можно было бы предусмотреть анимацию для окна, обеспечив его закрытие с использованием определенного визуального эффекта, такого как постепенное исчезновение до полной прозрачности. Применением, более ориентированным на бизнес-приложения, может быть постепенное увеличение четкости отображения сообщений об ошибках на экране, улучшая восприятие пользовательского интерфейса. Фактически поддержка анимации WPF может применяться в приложениях любого рода (бизнес-приложениях, мультимедийных программах, видеоиграх и т.д.) всякий раз, когда нужно создать более привлекательное впечатление у пользователей.

Как и для многих других аспектов WPF, с построением анимации не связано ничего нового. Единственная особенность заключается в том, что в отличие от других API-интерфейсов, которые вы могли использовать в прошлом (включая Windows Forms), разработчики не обязаны создавать необходимую инфраструктуру вручную. В WPF не придется заранее создавать фоновые потоки или таймеры, применяемые для продвижения вперед анимационной последовательности, определять специальные типы для представления анимации, очищать и перерисовывать изображения либо реализовывать утомительные математические вычисления. Подобно другим аспектам WPF анимацию можно строить целиком в разметке XAML, целиком в коде C# либо с использованием комбинации того и другого.

Поделиться с друзьями: