200 likes | 575 Views
Классы Windows Presentation Foundation. Типы приложений WPF. Windows Presentation Foundation (WPF) поддерживает четыре типа приложений :
E N D
Типы приложений 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 • WPF поддерживает встроенную модель навигации в стиле Web с использованием страниц (класс Page) и гиперссылок (класс Hyperlink) с уже готовыми средствами навигации. • WPF имеет два класса-навигатора NavigationWindowиFrame. • Обработку запросов навигации и управление временем жизни навигаторов выполняет служба навигации, реализованная в классе NavigationService. • Служба навигациисохраняет хронологию навигации в двух списках – с обратной историей навигации (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) дает следующие преимущества перед другими способами размещения содержимого для навигации: • страницы легко определятьи повторно использовать; • класс имеет доступ к службе навигации - объектуNavigationService; • через свойства класса Page (WindowTitle, WindowWidth, WindowHeight, ShowsNavigationUI) можно изменить заголовок, размеры и UI навигацииокна –хоста (host window); • имеют поддержку дизайнера в Microsoft Visual Studio.
Свойства класса 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 boolKeepAlive { 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 или PackURI. public bool Navigate( Uri source ); public bool Navigate( Uri source, Object navigationState ); public bool Navigate( Uri source, Object navigationState, boolsandboxExternalContent ); • Если значение параметра source равно null, существующее до вызова метода содержимое ( свойство Content) будет очищено. • При загрузке Web-содержимогоможет быть брошено Web-исключение , например, File Not Found. Эти исключения можно обработать в событии NavigationFailed.
Свойства класса NavigationService • Служба навигации предоставляет информацию об объектах навигации через свойства класса NavigationService:
Событие 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> :