При выполнении в лабораторной работе упражнения №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
Упражнение 5. Страничные приложения в WPF
WPF поддерживает переходы в стиле веб-обозревателя, которые могут использоваться в приложениях двух типов: автономных приложениях и XBAP ( XAML browser applications - приложения обозревателя XAML)
Платформа WPF имеет средства создавать страницы, которые в некоторых случаях могут быть более привычны пользователю, чем оконные приложения. В страничных приложениях содержимое страниц встраивается в специальный навигационный каркас, поддерживающий навигационные ссылки и журнал навигации. Корневым узлом в них является не класс Window, а производный от него класс NavigationWindow, который добавляет стандартный интерфейс навигации и всю необходимую инфраструктуру. Класс NavigationWindow имеет доступ к тем же самым средствам уровня приложения, что и Window.
- Добавьте к решению новый проект с именем WpfApp5 и назначьте его стартовым
- Удалите автоматически созданный мастером файл Window1.xaml и добавьте к проекту вместо него новый файл с именем NavExample.xaml по тому же оконному шаблону
- Откройте файл App.xaml и скорректируйте атрибут StartupUri="NavExample.xaml"
- Выполните проект WpfApp5, чтобы убедиться в отсутствии ошибок
- Откройте файл NavExample.xaml и скорректируйте его дескрипторный код так
<NavigationWindow x:Class="WpfApp5.NavExample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Упражнение 5" Height="300" Width="300" WindowStartupLocation="CenterScreen" > </NavigationWindow>
- Откройте файл NavExample.xaml.cs и скорректируйте его следующим образом
using System; using System.Collections.Generic; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; using System.Windows.Navigation; namespace WpfApp5 { /// <summary> /// Interaction logic for NavExample.xaml /// </summary> public partial class NavExample : NavigationWindow { public NavExample() { InitializeComponent(); //this.Navigate(new Page1()); } } }
- Запустите проект - пока мы видим пустой контейнер с заготовкой навигационного узла
Содержимое навигационного узла должно быть представлено классом, производным от библиотечного класса Page. Создадим три пробные страницы содержимого и подключим их к навигационному узлу с помощью метода Navigate().
- Добавьте к проекту новый элемент Page с именем Page1.xaml
- Отредактируйте дискрипторную часть файла Page1.xaml следующим образом
<Page x:Class="WpfApp5.Page1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > <StackPanel> <TextBlock TextAlignment="Center" FontSize="24">Страница 1</TextBlock> <TextBlock></TextBlock> <TextBlock> <Hyperlink Click="LinkClicked">На страницу 2</Hyperlink> </TextBlock> </StackPanel> </Page>
- Отредактируйте кодовую часть - файл Page1.xaml.cs следующим образом
using System; using System.Collections.Generic; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApp5 { public partial class Page1 : Page { public Page1() { InitializeComponent(); } private void LinkClicked(object sender, RoutedEventArgs e) { this.NavigationService.Navigate(new Page2()); } } }
- Добавьте к проекту новый элемент Page с именем Page2.axml
- Отредактируйте дискрипторную часть файла Page2.axml следующим образом
<Page x:Class="WpfApp5.Page2" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Page2" > <StackPanel> <TextBlock TextAlignment="Center" FontSize="24">Страница 2</TextBlock> </StackPanel> </Page>
- Добавьте в файл NavExample.xaml атрибут Source, подключающий при запуске каркаса начальную страницу содержимого Page1.xaml (вместо этого можно было бы добавить в конструктор класса NavExample кодовой части каркаса закомментированную строку создания экземпляра типа this.Navigate(new Page1()); )
<NavigationWindow x:Class="WpfApp5.NavExample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Упражнение 5" Height="300" Width="300" WindowStartupLocation="CenterScreen" Source="Page1.xaml" > </NavigationWindow>
- Запустите проект на выполнение и пощелкайте на ссылках - пока все работает
Мы создали каркас и две пустые страницы, которые ничего не делают. Каждая страница является автономной, даже если наполнить ее элементами управления. При переходе между страницами нужно научиться передавать информацию от странице к странице, т.е. хранить их состояние. Должен быть общий почтовый ящик, не зависящий от существования страниц, в котором бы эта информация хранилась. В WPF для передачи данных между страницами можно использовать словарь (массив пар "ключ-значение") Application.Current.Properties или 'зашивать' информацию прямо в объект новой страницы.
Продолжим развитие упражнение. Дополним первую страницу текстовым полем, через которое пользователь введет свое имя, а на второй странице выведем приветствие с этим именем через текстовую метку.
- Добавьте к странице Page1 именованное текстовое поле с меткой следующим образом
<Page x:Class="WpfApp5.Page1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Page1" > <StackPanel> <TextBlock TextAlignment="Center" FontSize="24">Страница 1</TextBlock> <TextBlock></TextBlock> <Label>Введите свое имя: </Label> <TextBox Name="nameBox" Width="200"></TextBox> <TextBlock></TextBlock> <TextBlock> <Hyperlink Click="LinkClicked">На страницу 2</Hyperlink> </TextBlock> </StackPanel> </Page>
Объекту TextBox мы присвоили имя, чтобы можно было обращаться к нему из кода.
- Измените кодовую часть страницы Page1 следующим образом
using System; using System.Collections.Generic; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApp5 { public partial class Page1 : Page { public Page1() { InitializeComponent(); } private void LinkClicked(object sender, RoutedEventArgs e) { Page2 page2 = new Page2(); page2.Message = nameBox.Text + " !!!";// Зашиваем информацию в объект страницы this.NavigationService.Navigate(page2); } } }