|
При выполнении в лабораторной работе упражнения №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);
}
}
}



