Система ресурсов WPF
Первой задачей будет исследование темы встраивания и доступа к ресурсам приложения. Инфраструктура WPF поддерживает два вида ресурсов. Первый из них — двоичные ресурсы; эта категория обычно включает элементы, которые большинство программистов считают ресурсами в традиционном смысле (встроенные файлы изображений или звуковых клипов, значки, используемые приложением, и т.д.).
Вторая категория, называемая объектными ресурсами или логическими ресурсами, представляет именованные объекты .NET, которые можно упаковывать и многократно применять повсюду в приложении. Несмотря на то что упаковывать в виде объектного ресурса разрешено любой объект .NET, логические ресурсы особенно удобны при работе с графическими данными произвольного рода, поскольку можно определить часто используемые графические примитивы (кисти, перья, анимации и т.д.) и ссылаться на них по мере необходимости.
Работа с двоичными ресурсами
Прежде чем перейти к теме объектных ресурсов, давайте кратко проанализируем, как упаковывать двоичные ресурсы вроде значков и файлов изображений (например, логотипов компании либо изображений для анимации) внутри приложений. Создайте в Visual Studio новый проект приложения WPF по имени
BinaryResourcesApp
. Модифицируйте разметку начального окна для обработки события
Loaded
элемента Window и применения
DockPanel
в качестве корня компоновки:
<Window x:Class="BinaryResourcesApp.MainWindow"
<! -- Для краткости разметка не показана -->
Title="Fun with Binary Resources" Height="500" Width="649"
Loaded="MainWindow_OnLoaded">
<DockPanel LastChildFill="True">
</DockPanel>
</Window>
Предположим, что приложение должно отображать внутри части окна один из трех файлов изображений, основываясь на пользовательском вводе. Элемент управления
Image
из WPF может использоваться для отображения не только типичного файла изображения (
*.bmp
,
*.gif
,
*.ico
,
*.jpg
,
*.png
,
*.wdp
или
*.tiff
), но также данных объекта
DrawingImage
(как было показано в главе 26). Можете построить пользовательский интерфейс окна, который поддерживает диспетчер компоновки
DockPanel
, содержащий простую панель инструментов с кнопками
Next (Вперед) и
Previous (Назад). Ниже панели инструментов расположите элемент управления
Image
, свойство
Source
которого в текущий момент не установлено:
<DockPanel LastChildFill="True">
<ToolBar Height="60" Name="picturePickerToolbar" DockPanel.Dock="Top">
<Button x:Name="btnPreviousImage" Height="40" Width="100" BorderBrush="Black"
Margin="5" Content="Previous" Click="btnPreviousImage_Click"/>
<Button x:Name="btnNextImage" Height="40" Width="100" BorderBrush="Black"
Margin="5" Content="Next" Click="btnNextImage_Click"/>
</ToolBar>
<b> <!-- Этот элемент Image будет заполняться в коде --> </b>
<Border BorderThickness="2" BorderBrush="Green">
<Image x:Name="imageHolder" Stretch="Fill" />
</Border>
</DockPanel>
Добавьте следующие пустые обработчики событий:
private void MainWindow_OnLoaded(
object sender, RoutedEventArgs e)
{
}
private void btnPreviousImage_Click(
object sender, RoutedEventArgs e)
{
}
private void btnNextImage_Click(
object sender, RoutedEventArgs e)
{
}
Во время загрузки окна изображения добавляются в коллекцию, по которой будет совершаться проход с помощью кнопок Next и Previous. Располагая инфраструктурой приложения, можно заняться исследованием разных вариантов ее реализации.
Включение в проект несвязанных файлов ресурсов
Один из вариантов предусматривает поставку файлов изображений в виде набора несвязанных файлов в каком-то подкаталоге внутри пути установки приложения. Начните с создания в проекте новой папки (по имени
Images
). Добавьте в папку несколько изображений, щелкнув правой кнопкой мыши внутри данной папки и выбрав в контекстном меню пункт
Add►
Existing Item (Добавить►Существующий элемент). В открывшемся диалоговом окне
Add Existing Item (Добавление существующего элемента) измените фильтр файлов на
*.*, чтобы стали видны файлы изображений. Вы можете добавлять собственные файлы изображений или задействовать три файла изображений с именами
Deer.jpg
,
Dogs.jpg
и
Welcome.jpg
из загружаемого кода примеров.
Конфигурирование несвязанных ресурсов
Чтобы скопировать содержимое папки
\Images
в папку
\bin\Debug
при компиляции проекта, выберите все изображения в окне
Solution Explorer, щелкните правой кнопкой мыши и выберите в контекстном меню пункт
Properties (Свойства); откроется окно
Properties (Свойства). Установите свойство
Build Action (Действие сборки) в
Content (Содержимое), а свойство
Copy Output Directory (Копировать в выходной каталог) в
Copy always (Копировать всегда), как показано на рис. 27.1.