|
При выполнении в лабораторной работе упражнения №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
Использование библиотеки ресурсов
Теперь осталось применить нашу библиотеку ресурсов в исполнимом приложении, где мы разместим в окне интерфейсные элементы и для их настройки будем извлекать соответствующие объекты как ресурсы из откомпилированной библиотечной сборки.
-
Командой меню File/Add/New Project оболочки добавьте к решению новый проект с именем UseLibraryResource по шаблону WPF Application и назначьте его стартовым командой Set as StartUp Project
-
В панели Solution Explorer раскройте узел проекта UseResource первого упражнения и перетащите из него мышью папку Images на корневой узел проекта UseLibraryResource. Оболочка скопирует эту папку вместе с содержимым в наш новый проект UseLibraryResource
-
Выделяя последовательно файлы рисунков в папке Images, установите (или проверьте) в панели 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:
-
В панели Solution Explorer выделите узел проекта UseLibraryResource и щелкните на пиктограмме Show All Files этой панели для раскрытия дерева файлов проекта -
Раскройте узел UseLibraryResource/bin/Debug и убедитесь, что он не содержит пока никаких файлов
-
В панели Solution Explorer вызовите контекстное меню для узла References и выполните команду Add Reference, чтобы вызвать окно подключения библиотечных сборок -
В окне Add Reference откройте вкладку Projects, выделите сборку LibraryResource.dll и щелкните на кнопке OK
Ссылка на эту библиотеку будет подключена к текущему проекту UseLibraryResource и появится в его узле References.
-
Откомпилируйте (или запустите) пустой проект UseLibraryResource и в панели Solution Explorer щелкните на кнопке Refresh, чтобы обновить представление панели
Мы видим, что оболочка скопировала готовую библиотечную сборку LibraryResource.dll в один каталог с исполнимой сборкой UseLibraryResource.exe. Важно помнить, что для нормальной работы приложения, использующего ресурсы нашей библиотечной сборки (или нуждающегося в любой другой пользовательской библиотеке), файл LibraryResource.dll при развертывании на клиентской машине всегда должен находиться в одном каталоге с исполнимым файлом приложения. Либо при развертывании библиотеку нужно будет размещать и специальным образом регистрировать в глобальном хранилище сборок GAC (Global Assembly Cache) на клиентской машине, что гораздо сложнее (но выполнимо).
-
Заполните файл Window1.xaml проекта UseLibraryResource следующей разметкой
<Window x:Class="UseLibraryResource.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:resLib="clr-namespace:LibraryResource;assembly=LibraryResource"
Title="UseLibraryResource"
MinHeight="300"
MinWidth="300"
Height="300"
Width="300"
WindowStartupLocation="CenterScreen"
Background="{x:Static SystemColors.MenuBarBrush}">
<!-- Содержимое окна -->
<StackPanel>
<!-- Это не ресурс, а элемент визуального дерева -->
<TextBlock HorizontalAlignment="Center"
FontSize="18"
FontWeight="Bold"
Margin="0,0,0,5">
Применение ресурсов
</TextBlock>
<!-- Синтаксис подключения ресурсов как статических полей и свойств библиотеки по ключу -->
<Label HorizontalAlignment="Center"
Content="{DynamicResource {x:Static resLib:CustomResources.Title1Key}}" />
<Button Name="btn1" Padding="5" Margin="5"
FontWeight="Bold" FontSize="16"
Foreground="{DynamicResource {x:Static resLib:CustomResources.ForegroundBrushKey}}"
Background="{DynamicResource {x:Static resLib:CustomResources.BackgroundBrushKey}}"
Content="Только DynamicResource" />
<Button Name="btn2" Padding="5" Margin="5"
FontWeight="Bold" FontSize="16"
Foreground="{DynamicResource {x:Static resLib:CustomResources.ForegroundBrushKey}}"
Background="{DynamicResource {x:Static resLib:CustomResources.BackgroundBrushKey}}"
Content="Только DynamicResource" />
<!-- Синтаксис подключения ресурсов из ресурсного словаря библиотеки по имени ресурса -->
<Label HorizontalAlignment="Center"
Content="{DynamicResource {ComponentResourceKey
TypeInTargetAssembly={x:Type resLib:CustomResources},
ResourceId=Title2}}" />
<Button Click="Button_Click" Padding="5" Margin="5"
FontWeight="Bold" FontSize="16"
Foreground="{DynamicResource {ComponentResourceKey
TypeInTargetAssembly={x:Type resLib:CustomResources},
ResourceId=ForegroundBrush2}}"
Background="{DynamicResource {ComponentResourceKey
TypeInTargetAssembly={x:Type resLib:CustomResources},
ResourceId=BackgroundBrush2}}"
Content="Только DynamicResource" />
<Button Click="Button_Click" Padding="5" Margin="5"
FontWeight="Bold" FontSize="16"
Foreground="{DynamicResource {ComponentResourceKey
TypeInTargetAssembly={x:Type resLib:CustomResources},
ResourceId=ForegroundBrush2}}"
Background="{DynamicResource {ComponentResourceKey
TypeInTargetAssembly={x:Type resLib:CustomResources},
ResourceId=BackgroundBrush2}}"
Content="Только DynamicResource" />
</StackPanel>
</Window>-
Переключите редактор разметки в режим Design - оболочка видит библиотечные ресурсы уже на этапе проектирования
-
Заполните файл Window1.xaml.cs проекта UseLibraryResource следующим процедурным кодом (код файла Window1.xaml.cs приводится целиком)
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using LibraryResource;// Подключаем пространство имен библиотеки с ресурсами
namespace UseLibraryResource
{
public partial class Window1 : Window
{
public Window1()
{
// Инициализация интерфейсных элементов
InitializeComponent();
// Создаем и добавляем программно объекты ресурсов в коллекцию окна
//
// ... alternateColor
SolidColorBrush solidColorBrush = new SolidColorBrush();
solidColorBrush.Color = Colors.Blue;
this.Resources.Add("alternateColor", solidColorBrush);
//
// ... alternateImage
ImageBrush imageBrush = new ImageBrush();
imageBrush.ImageSource = new BitmapImage(
new Uri(@"Images\10440.jpg", UriKind.Relative)
);
imageBrush.TileMode = TileMode.Tile;
imageBrush.ViewportUnits = BrushMappingMode.Absolute;// Не путать с ViewboxUnits
imageBrush.Viewport = new Rect(0, 0, 32, 32);
imageBrush.Opacity = 0.5D;// Можно и без D, преобразует неявно из float в double
this.Resources.Add("alternateImage", imageBrush);
// Регистрируем обработчики программно
btn1.Click += btn1_Click;
btn2.Click += btn2_Click;
}
// Используем внешние ресурсы
void btn1_Click(object sender, RoutedEventArgs e)
{
CustomResources.changeResourceKeyFlag =
!CustomResources.changeResourceKeyFlag;
btn1.Foreground = btn1.TryFindResource(
CustomResources.ForegroundBrushKey) as SolidColorBrush;
btn1.Background = (ImageBrush)btn1.TryFindResource(
CustomResources.BackgroundBrushKey);
}
// Используем внешние ресурсы
void btn2_Click(object sender, RoutedEventArgs e)
{
CustomResources.changeResourceKeyFlag =
!CustomResources.changeResourceKeyFlag;
try
{
btn2.Foreground = btn2.FindResource(
CustomResources.ForegroundBrushKey) as SolidColorBrush;
btn2.Background = (ImageBrush)btn2.FindResource(
CustomResources.BackgroundBrushKey);
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
bool changeResourceFlag2 = true;
private void Button_Click(object sender, RoutedEventArgs e)
{
// Приводим ссылку к типу Button
Button btn = sender as Button;
if (btn == null)
return;
if (changeResourceFlag2)
{
// Используем внутренние ресурсы окна
btn.Foreground= (SolidColorBrush)this.Resources["alternateColor"];
btn.Background = (ImageBrush)this.Resources["alternateImage"];
}
else
{
// Используем внешние ресурсы
btn.Foreground = btn.TryFindResource(
CustomResources.ForegroundBrushKey) as SolidColorBrush;
btn.Background = (ImageBrush)btn.TryFindResource(
CustomResources.BackgroundBrushKey);
}
changeResourceFlag2 = !changeResourceFlag2;// Готовим другой вариант
}
}
}-
Запустите и испытайте работу приложения UseLibraryResource, разберитесь с кодом
Не стоит забывать, что при извлечении ресурсов через ключи типа ComponentResourceKey следует всегда использовать обязательно динамические, а не статические ресурсы.





