12_Березина_Pages

advertisement
Классы Windows Presentation Foundation
System.Object
DispatcherObject
Application
DependencyObject
NavigationService
FrameworkTemplate
Visual
ContentElement
UIElement
FrameworkContentElement
Style
FrameworkElement
Page
Shape
TextBlock
ContentControl
RangeBase
TextBoxBase
Frame
Slider
TextBox
Window
ProgressBar
RichTextBox
Grid
ItemsControl
Menu
ContextMenu
HeaderedItemsControl
MenuItem
Button
Toolbar
TreeViewItem
Selector
RepeatButton
TabControl
ToggleButton
CheckBox
Canvas
MenuBase
NavigationWindow
ButtonBase
Panel
ToolBarTray
Control
RadioButton
ListBox
ListView
TreeView
ComboBox
Типы приложений WPF
 Windows Presentation Foundation (WPF) поддерживает четыре типа приложений:
• Standalone Applications - традиционные Windows-приложения, представляющие
собой исполняемую сборку, которая устанавливается и выполняется на клиентской
машине.
• XAML browser applications (XBAPs) - приложения, состоящие из страниц с
возможностью навигации, скомпилированные в исполняемые сборки, которые
выполняются в Windows Internet Explorer.
• Custom Control Libraries - сборки(non-executable) с повторно используемыми
элементами управления.
• Class Libraries – сборки (non-executable) с повторно используемыми классами.
Навигация в WPF
Object
DispatcherObgect
NavigationService
DependencyObject
 WPF имеет два класса-навигатора
NavigationWindow и Frame.
Visual
 Обработку запросов навигации и
управление временем жизни навигаторов
выполняет служба навигации,
реализованная в классе NavigationService.
UIElement
FrameworkElement
Page
Control
PageFunctionBase
ContentControl
PageFunction<T>
Frame
 WPF поддерживает встроенную модель
навигации в стиле Web с использованием
страниц (класс Page) и гиперссылок (класс
Hyperlink) с уже готовыми средствами
навигации.
Window
NavigationWindow
 Служба навигации сохраняет
хронологию навигации в двух списках –
с обратной историей навигации (back
navigation history) и прямой историей
навигации (forward navigation history).
 Класс Frame может поддерживать как
свою собственную историю навигации, так
и использовать историю навигатора,
который является для него хостом.
Хронология навигации
 При каждом переходе на новую страницу добавляется вход в обратную историю
навигации.
 При переходе на предыдущую страницу по кнопке возврата информация о текущей
странице добавляется в список прямой истории навигации .
 Если после возврата на предыдущую страницу выполняется переход к новой странице,
список следующих страниц очищается.
 По умолчанию служба навигации не сохраняет в навигационной истории экземпляр
содержимого, при переходе каждый раз создается новый объект. При большом числе
переходов это позволяет сэкономить память, но при этом теряется состояние объектов
навигации.
 WPF поддерживает несколько способов сохранения состояния объектов навигации.
 Визуально XBAPs используют как навигатор Internet Explorer, но в реальности
навигатором XBAPs является NavigationWindow. История навигации, которая
поддерживается NavigationWindow, интегрируется с историей навигации, которая
управляется Internet Explorer.
Класс Page
 Класс Page инкапсулирует страницу содержимого (page of content), которую можно
разместить в навигаторе - Windows Internet Explorer, NavigationWindow или Frame.
 Для определения страниц можно использовать как разметку, так и разметку и код
одновременно или только код.
 Использование страниц (объектов класса Page) дает следующие преимущества перед
другими способами размещения содержимого для навигации:
FrameworkElement
Page
PageFunctionBase
• страницы легко определять и повторно использовать;
• класс имеет доступ к службе навигации - объекту
NavigationService;
• через свойства класса Page (WindowTitle, WindowWidth,
WindowHeight, ShowsNavigationUI) можно изменить заголовок,
размеры и UI навигации окна –хоста (host window);
• имеют поддержку дизайнера в Microsoft Visual Studio.
PageFunction(T)
Свойства класса Page
 Класс Page имеет только один открытый конструктор - без параметров.
 Содержимое (content ) передается странице через свойство
public Object Content { get; set; }
 Класс Page может иметь только один дочерний элемент (content), обычно это один из
контейнеров (Grid, StackPanel ,…).
 Свойства класса Page
public double WindowHeight { get; set; }
public double WindowWidth { get; set; }
public string WindowTitle { get; set; }
дают возможность изменять размеры и заголовок окна-хоста ( Window, NavigationWindow
и Windows Internet Explorer).
 Если как окно-хост используется Frame, все эти свойства можно использовать только
для чтения.
 По умолчанию как заголовок (title) окна, которое является хостом для страницы,
используется имя файла, который содержит страницу.
Окно-хост для страницы
 Окном-хостом для страницы может быть объект класса Window, NavigationWindow,
Frame, UserControl или браузер.
 Указать окно-хост для страницы можно одним из способов:
• cсылку на объект класса Page присвоить свойству Content классов Window,
NavigationWindow или Frame ;
• свойству Source классов NavigationWindow или Frame присвоить URI страницы;
• указать как StartupUri в приложении;
• указать как StartupUri в XBAP.
 В процессе навигации переход на другие страницы выполняется
• декларативно с использованием гиперссылок (Hyperlink);
• программно с помощью методов класса NavigationService;
• с помощью встроенных элементов управления в навигаторах.
URI (Универсальный идентификатор ресурса)
 URI (universal resource identifier) – строка символов, кодирующая адрес
информационного ресурса. Спецификации URI определены в интернет-стандартах RFC
2396 и RFC 3986.
 Все элементы URI должны состоять только из символов базовой латиницы (символы из
кодировок Unicode/ISO 10646). Чтобы включить в них другие символы, их необходимо
преобразовать в формат UTF-8 и представить в виде %xx, где xx — шестнадцатеричный
код байта.
 Международный код ресурса IRI (international resource identifier) позволяет применять
символы Юникода. Спецификации IRI определены в стандарте RFC 3987.
 Класс Uri в .NET Framework версии 3.5, 3.0 с пакетом обновления 1 (SP1) и 2.0 с пакетом
обновления 1 (SP1) поддерживает IRI в соответствии со стандартом RFC 3987.
 Полный URI имеет вид
Протокол:// авторизация// путь к ресурсу на сервере ? запрос
Обязательным элементом полного URI является протокол, остальные элементы зависят
от протокола.
 Относительные URI могут использоваться, когда тем или иным способом определен
базовый URI. Относительные URI ресурсов указываются относительно базового URI.
Класс Uri
 Класс Uri обеспечивает объектное представление универсального кода ресурсов (URI),
а также простой доступ к его частям.
 После создания объекта Uri его свойства доступны только для чтения. Создание
объекта, который допускает изменение, поддерживает класс UriBuilder.
 Конструкторы класса (5) создают экземпляры Uri на основе строки кода URI и/или на
основе базовых и относительных Uri.
public Uri( string uriString );
public Uri( Uri baseUri, string relativeUri );
 Конструкторы анализируют URI, выполняют преобразования в канонический формат и
применяют необходимые escape-кодировки. Конструкторы бросают исключение
UriFormatException, если входные данные заданы неправильно.
 Конструкторы не проверяют, что объект Uri ссылается на доступный ресурс.
Интерфейс IUriContext
 Интерфейс IUriContext обеспечивает установку базового URI.
public interface IUriContext
{ Uri BaseUri { get; set; }
}
 Один из конструкторов класса Uri
public Uri( string uriString, UriKind uriKind );
позволяет указать, является ли строка URI относительным или абсолютным URI.
Перечисление UriKind имеет значения Absolute, Relative и RelativeOrAbsolute.
Сохранение состояния страниц при навигации
 При переходе на другую страницу объект-страница в памяти уничтожается, но
предварительно с помощью сериализации сохраняется информация о состоянии
некоторых элементов управления.
 При возвращении на страницу WPF создает страницу заново из исходного XAML файла
и восстанавливает состояние сохраненных элементов управления.
 Для элементов управления на странице сохраняются значения только тех свойств
зависимостей , у которых при регистрации был установлен флаг журнала, указывающий
что они должны помещаться в журнал навигации. Например, флаг журнала имеет
значение true для свойства Text элемента TextBox, но равен false для свойства Text
элемента TextBlock.
 Если страница создается динамически, то у WPF нет ссылки на XAML файл для
страницы и объект страницы всегда будет сохраняться в памяти.
Как сохранить состояние страницы при навигации?
 Чтобы сохранить введенные данные при переходе на другие страницы, можно
использовать один из способов:
• Присвоить значение true свойству KeepAlive класса Page.
• Реализовать свою логику сохранения данных со страницы, например, для полей
данных на странице определить свойства зависимостей и при регистрации присвоить
значение true флагу журнала.
• Использовать страничные функции и передавать необходимую информацию от
страницы к странице через параметры и возвращаемые значения.
Свойство KeepAlive класса Page
public bool KeepAlive { get; set; }
 При переходе на другую страницу (в любом направлении) для страницы создается вход
в истории навигации, но по умолчанию сохраняется только Pack URI для страницы, объект
Page не сохраняется.
 При возвращении на страницу для нее создается новый объект на основе сохраненного
Pack URI.
 Если значение свойства KeepAlive установлено в true, страница будет сохраняться в
памяти в текущем состоянии. При переходах на эту страницу событие Initialized не
инициируется, но события Loaded и Unloaded происходят каждый раз. По умолчанию
значение свойства равно false.
 Этот способ значительно увеличивает накладные расходы, связанные с памятью.
Следует избегать использования значения true для свойства KeepAlive за исключением
случая, когда на страницу выполняется много переходов, а содержимое страницы требует
много времени для инициализации.
Класс NavigationService
Класс NavigationService выполняет обработку запросов навигации и управляет
временем жизни навигаторов.
 Ссылку на NavigationService из классов-навигаторов можно получить
• как возвращаемое значение метода GetNavigationService, определенного в классах
NavigationWindow и Frame;
• через свойство NavigationService классов Page и Frame;
 Класс содержит методы, свойства и события для поддержки навигации.
 Класс NavigationService инкапсулирует средства для загрузки содержимого (content) в
контекст навигатора.
 В качестве содержимого можно использовать любые объекты.NET Framework и HTML
файлы, но использование объектов типа Page имеет преимущества в WPF навигации.
 Содержимое (content) можно указать одним из двух способов
• явно, присвоив свойству Content класса ссылку на объект с содержимым;
• неявно при вызовах методов Navigate, GoBack или GoForward.
 Навигация выполняется асинхронно, поэтому свойство Content может не сразу
возвращать корректную ссылку.
Метод Navigate класса NavigationService
 Для навигации по содержимому можно вызвать одну из перегруженных версий метода
Navigate, передав через параметры ссылку на объект, для которого выполняется
навигация, и ссылку на дополнительный объект с данными.
public bool Navigate( Object root );
public bool Navigate( Object root, Object navigationState );
 Класс имеет перегруженные версии метода Navigate, идентифицирующие объект
навигации по абсолютному или относительному URI, который должен содержать
корректный Web URL или Pack URI.
public bool Navigate( Uri source );
public bool Navigate( Uri source, Object navigationState );
public bool Navigate( Uri source, Object navigationState,
bool sandboxExternalContent );
 Если значение параметра source равно null, существующее до вызова метода
содержимое ( свойство Content) будет очищено.
 При загрузке Web-содержимого может быть брошено Web-исключение , например, File
Not Found. Эти исключения можно обработать в событии NavigationFailed.
Свойства класса NavigationService
 Служба навигации предоставляет информацию об объектах навигации через свойства
класса NavigationService:
public
Object Content
{ get; set; }
Ссылка на текущее содержимое (content).
public
Uri Source
{ get; set; }
Объект класса Uri с URI для текущего содержимого. Когда
свойству присваивается новое значение, навигатор
(NavigationWindow или Frame) переходит по указанному
URI.Допускается значение null.
public Uri
CurrentSource
{ get; }
Uri для последнего содержимого навигации (если
использовался URI), null в противном случае. Значение
свойства CurrentSource не изменяется до тех пор, пока
переход к другому URI не будет успешно завершен.
public bool
CanGoForward
{ get; }
Проверяет, есть ли хотя бы один вход в прямой истории
навигации.
public bool
CanGoBack
{ get; }
Проверяет, есть ли хотя бы один вход в обратной истории
навигации.
Методы класса NavigationService
public void
GoForward();
Переход к последнему входу в прямой истории навигации.
Бросает исключение, если в прямой истории навигации нет ни
одного входа.
public void
GoBack();
Переход к последнему входу в обратной истории навигации.
Бросает исключение, если в обратной истории навигации нет
ни одного входа.
public JournalEntry
Удаляет последний вход из обратной истории навигации.
RemoveBackEntry();
public void
Refresh();
Инициирует новую загрузку текущей страницы.
При переходе к текущему объекту навигации (вызовом
Navigate или Refresh), новый вход в историю навигации не
добавляется.
Событие Navigating
 При новом запросе на выполнение навигации событие Navigating происходит первым,
еще до того, как будет запрошен источник содержимого( source content).
 Объект NavigatingCancelEventArgs, доступ к которому можно получить через параметры
обработчика, содержит информацию о запросе.
 При обработке этого события можно изменить параметры навигации перед
завершением навигации.
 В частности, при обработке этого события еще можно отказаться от навигации,
присвоив значение true свойству Cancel. В этом случае другие события навигации не
произойдут.
 Отказаться от навигации нельзя, если хостом приложения является браузер.
 Если событие Navigating происходит в NavigationService, то оно происходит и в объекте
Application.
 Обработчик события Navigating получает через свойства объекта
NavigatingCancelEventArgs детальную информацию о событии.
Структурная навигация
 При навигации обмен данными между страницами можно организовать путем вызова
метода, через параметр которого можно передать данные вызывающей странице.
 По аналогии со структурным программированием такой способ организации навигации
получил название структурная навигация (structured navigation).
 Для структурной навигации определен специальный обобщенный класс, который
используется как базовый для типа вызываемой страницы.
public class PageFunction<T> : PageFunctionBase
 Обобщенный параметр T определяет тип объекта, который служба навигации передает
вызывающей странице .
Обмен данными при структурной навигации
 В классе PageFunction<T> определен защищенный метод,
protected virtual void OnReturn( ReturnEventArgs<T> e );
для возврата на вызывающую страницу. Через его параметр ReturnEventArgs<T> можно
передать информацию на вызывающую страницу.
 При вызове метода OnReturn(.) служба навигации бросает событие Return, которое
может обработать только вызывающая страница.
public event ReturnEventHandler<T> Return;
 Вызывающая страница получает ссылку на объект ReturnEventArgs<T> в обработчике
события Return.
 По умолчанию при вызове OnReturn(.) вызванная страница удаляется из истории
навигации.
 Конструкторы и свойства класса ReturnEventArgs<T> :
public ReturnEventArgs();
Конструктор без параметров.
public
ReturnEventArgs (T result );
Конструктор, инициализирующий свойство
Result –возвращаемое значение.
public T Result { get; set; }
Значение, которое возвращает страничная
функция.
Download