| исключение в лабораторной работе № 3 |
Создание приложений 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);
}
}
}



