При выполнении в лабораторной работе упражнения №1 , а именно при выполнении нижеследующего кода: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Microsoft.Xna.Framework.Graphics;
namespace Application1 { public partial class MainForm : Form { // Объявим поле графического устройства для видимости в методах GraphicsDevice device;
public MainForm() { InitializeComponent();
// Подпишемся на событие Load формы this.Load += new EventHandler(MainForm_Load);
// Попишемся на событие FormClosed формы this.FormClosed += new FormClosedEventHandler(MainForm_FormClosed); }
void MainForm_FormClosed(object sender, FormClosedEventArgs e) { // Удаляем (освобождаем) устройство device.Dispose(); // На всякий случай присваиваем ссылке на устройство значение null device = null; }
void MainForm_Load(object sender, EventArgs e) { // Создаем объект представления для настройки графического устройства PresentationParameters presentParams = new PresentationParameters(); // Настраиваем объект представления через его свойства presentParams.IsFullScreen = false; // Включаем оконный режим presentParams.BackBufferCount = 1; // Включаем задний буфер // для двойной буферизации // Переключение переднего и заднего буферов // должно осуществляться с максимальной эффективностью presentParams.SwapEffect = SwapEffect.Discard; // Устанавливаем размеры заднего буфера по клиентской области окна формы presentParams.BackBufferWidth = this.ClientSize.Width; presentParams.BackBufferHeight = this.ClientSize.Height;
// Создадим графическое устройство с заданными настройками device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware, this.Handle, presentParams); }
protected override void OnPaint(PaintEventArgs e) { device.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);
base.OnPaint(e); } } } Выбрасывается исключение: Невозможно загрузить файл или сборку "Microsoft.Xna.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d" или один из зависимых от них компонентов. Не удается найти указанный файл. Делаю все пунктуально. В чем может быть проблема? |
Ресурсы в WPF
Все необходимые для выполнения данной работы программы можно найти в прилагаемом каталоге.
Три важнейших класса:
- System.Windows.FrameworkElement
- System.Windows.FrameworkContentElement
- System.Windows.Application
содержат свойство Resources типа System.Windows.ResourceDictionary. Соответственно, поскольку большинство элементов управления WPF наследуют от этих классов, то любой из них содержит свою коллекцию Resources как экземпляр класса-словаря ResourceDictionary, которую можно наполнить. Ресурсы, определенные в элементе, доступны только этому элементу и его потомкам.
Чаще всего ресурсы определяют в коллекции корневого элемента-окна <Window.Resources> или в коллекции приложения <Application.Resources>. Там их разработчику привычнее найти и область видимости таких ресурсов распространяется на все дочерние элементы, то есть на все визуальное дерево. По умолчанию, если не принимать специальных мер, ресурсы окна невидимы в других окнах приложения, а ресурсы одного приложения (сборки) видимы во всех его окнах, но невидимы в других сборках.
Ресурсы представляют собой XAML -эквивалент создания констант в коде (константных переменных или полей). Они позволяют определить объект любого типа один раз, а затем многократно использовать его в коде по мере необходимости, чаще всего - для настройки визуальных элементов пользовательского интерфейса. Помещенная в ресурсы информация отделяется от процедурного кода, но может этим кодом избирательно фильтроваться в зависимости от предпочтений пользователя, культуры, текущего региона или настроек операционной системы. Для различных культур и свойств можно использовать различные коллекции ресурсов, настраивающих интерфейс.
Каждому объекту, задекларированному (определенному) как ресурс, необходимо задать значение свойства x:Key. Префикс 'x:' означает пространство имен XAML, а не пространство имен WPF. Свойство x:Key означает имя, по которому другие элементы WPF будут получать доступ к ресурсу. Это свойство должно быть уникальным не во всем приложении, а лишь в той коллекции-словаре, где определено. Имена ресурсов определяются с учетом регистра.
При синтаксическом разборе ссылки на ресурс в XAML, синтаксический анализатор XAML ( парсер XAML, parse - разбор, разбирать) выполняет поиск ресурса с соответствующим ключем вначале в словаре текущего элемента, подключающего ресурс. Если ресурс не был найдет, поиск последовательно продолжается в словарях родителей элемента в направлении к корню визуального дерева окна, а затем в словаре приложения и далее - в присоединенных сборках или ресурсах системы. Если ресурс нигде не был найден, выдается исключение XamlParseException.
Упражнение 1. Использование коллекций ресурсов
В этом упражнении мы рассмотрим особенности использования объектных ресурсов на этапе проектирования в разметочной части (декларативный режим) и управление ими в кодовой части (режим runtime ). Код упражнения построим так, чтобы он иллюстрировал по возможности больше разных сторон работы с объектными ресурсами. Вначале приведем работоспособный код, а потом его разберем.
Многие студенты, выполняя работы по WPF или ASP.NET в среде проектирования Visual Studio, где разметочная часть класса окна представлена вкладками Design и XAML (в ASP.NET: вкладками Design, Split и Source, а еще раньше - Design и HTML ), не пользуясь режимом Design, все же оставляют частично эту вкладку открытой. То же самое происходит и с ненужными в данный момент выдвижными панелями оболочки. Ничего иного, как занять полезное место на экране, эта вкладка нам не дает, поскольку мы в основном работаем только с дескрипторным кодом. Поэтому, лучше полностью раскрыть вкладку XAML на весь экран, пользы будет больше. А режим Design оставим дизайнеру, домохозяйке или "будущему программисту Васе". Хотя сами туда тоже иногда будем заглядывать (для справки).
Размещение ресурсов в коллекции окна
- Создайте новое решение с именем Resources командой File/New/Project и новый проект с именем UseResource
- Добавьте к корню проекта UseResource новую папку Images и скопируйте в нее контекстной командой Add/Existing Item из прилагаемого к работе каталога Source три рисунка, как показано на снимке
-
Выделяя последовательно эти файлы рисунков, установите (или проверьте) в панели Properties для них следующие свойства
-
FACE02.ICO, FACE04.ICO:
- Build Action=Resource
- Copy to Output Directory=Do not copy
-
10440.jpg:
- Build Action=None
- Copy to Output Directory=Copy if newer
-
FACE02.ICO, FACE04.ICO:
Эти растровые изображения мы в дальнейшем используем для создания ресурсов, обеспечивающих фон кнопок интерфейса окна.
- Откройте файл App.xaml и добавьте в коллекцию ресурсов приложения объект SolidColorBrush со следующими настройками
<Application x:Class="UseResource.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="Window1.xaml"> <!-- Определение ресурсов в коллекции приложения --> <Application.Resources> <SolidColorBrush x:Key="ControlColorBrush" Color="{x:Static SystemColors.ControlColor}" /> </Application.Resources> </Application>
Цвет для настройки помещаемого в ресурсы объекта SolidColorBrush извлекается из принадлежащего WPF статического свойства ControlColor статического класса SystemColors. Этот ресурс мы используем в параметрах окна для задания его цвета фона. В дальнейшем мы более подробно рассмотрим механизм использования статических свойств и полей в объектных ресурсах, а пока заметим, что псевдоним x в строке
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
отображает пространство имен WPF на разметку для синтаксического анализатора XAML.
- Заполните файл Window1.xaml следующим содержимым (разметка файла приводится полностью)
<Window x:Class="UseResource.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="UseResource" MinHeight="300" MinWidth="300" Height="300" Width="300" WindowStartupLocation="CenterScreen" Background="{StaticResource ControlColorBrush}"> <!-- Определение ресурсов в коллекции окна --> <Window.Resources> <TextBlock x:Key="Title1" TextAlignment="Center" Text="1. Модификация объекта ресурса" FontSize="14" FontWeight="Bold" FontFamily="Arial" FontStyle="Italic" TextDecorations="Underline" Foreground="DarkViolet" /> <SolidColorBrush x:Key="ForegroundBrush1" Color="Blue" /> <ImageBrush x:Key="BackgroundBrush1" TileMode="Tile" ViewportUnits="Absolute" Viewport="0 0 10 10" ImageSource="Images/FACE02.ICO" Opacity="0.5" /> <TextBlock x:Key="Title2" TextAlignment="Center" Text="2. Полная замена объекта ресурса" FontSize="14" FontWeight="Bold" FontFamily="Arial" FontStyle="Italic" TextDecorations="Underline" Foreground="DarkViolet" /> <SolidColorBrush x:Key="ForegroundBrush2" Color="Red" /> <ImageBrush x:Key="BackgroundBrush2" TileMode="Tile" ViewportUnits="Absolute" Viewport="0 0 24 24" ImageSource="Images/FACE04.ICO" Opacity="0.3" /> </Window.Resources> <!-- Содержимое окна --> <StackPanel> <!-- Это не ресурс, а элемент визуального дерева --> <TextBlock HorizontalAlignment="Center" FontSize="18" FontWeight="Bold" Margin="0,0,0,5"> Применение ресурсов </TextBlock> <!-- Синтаксис подключения ресурсов 'как элемента свойства' --> <Label HorizontalAlignment="Center"> <Label.Content> <StaticResource ResourceKey="Title1" /> </Label.Content> </Label> <Button Name="btn1" Padding="5" Margin="5" FontWeight="Bold" FontSize="16" > <Button.Foreground> <DynamicResource ResourceKey="ForegroundBrush1" /> </Button.Foreground> <Button.Background> <DynamicResource ResourceKey="BackgroundBrush1" /> </Button.Background> Использует DynamicResource </Button> <Button Name="btn2" Padding="5" Margin="5" FontWeight="Bold" FontSize="16" > <Button.Foreground> <StaticResource ResourceKey="ForegroundBrush1" /> </Button.Foreground> <Button.Background> <StaticResource ResourceKey="BackgroundBrush1" /> </Button.Background> Использует StaticResource </Button> <!-- Синтаксис подключения ресурсов 'как расширения разметки' --> <Label HorizontalAlignment="Center" Content="{StaticResource ResourceKey=Title2}" /> <Button Click="btn3_Click" Padding="5" Margin="5" FontWeight="Bold" FontSize="16" Foreground="{DynamicResource ResourceKey=ForegroundBrush2}" Background="{DynamicResource ResourceKey=BackgroundBrush2}"> Использует DynamicResource </Button> <!-- Упрощенный синтаксис без указания ResourceKey --> <Button Click="btn4_Click" Padding="5" Margin="5" FontWeight="Bold" FontSize="16" Foreground="{StaticResource ForegroundBrush2}" Background="{StaticResource BackgroundBrush2}"> Использует StaticResource </Button> </StackPanel> </Window>
Представление разметки в режиме Design на данном этапе должно выглядеть так