System windows controls page

Содержание
  1. Страничные интерфейсы
  2. Класс Page
  3. Controls for Windows apps
  4. Intro
  5. Get the Windows UI Library
  6. Alphabetical index
  7. XAML Controls Gallery
  8. Additional controls
  9. Общие сведения о переходах Navigation Overview
  10. Переходы в приложениях WPF Navigation in WPF Applications
  11. Реализация страницы Implementing a Page
  12. Настройка начальной страницы Configuring a Start Page
  13. Настройка заголовка, ширины и высоты основного окна Configuring the Host Window’s Title, Width, and Height
  14. Переход по гиперссылке Hyperlink Navigation
  15. Переход к фрагменту Fragment Navigation
  16. Служба переходов Navigation Service
  17. Программный переход с помощью службы переходов Programmatic Navigation with the Navigation Service
  18. Получение ссылки на службу переходов Getting a Reference to the NavigationService
  19. Программный переход к объекту страницы Programmatic Navigation to a Page Object
  20. Программный переход с URI типа pack Programmatic Navigation with a Pack URI
  21. Обновление текущей страницы Refreshing the Current Page
  22. Время существования перехода Navigation Lifetime
  23. Запоминание перехода в журнале Remembering Navigation with the Journal
  24. Перемещение по журналу в браузере Internet Explorer Navigating the Journal from Internet Explorer
  25. Перемещение по журналу с помощью WPF Navigating the Journal Using WPF
  26. Время существования страницы и журнал Page Lifetime and the Journal
  27. Сохранение состояния содержимого с помощью журнала переходов Retaining Content State with Navigation History

Страничные интерфейсы

Чтобы создать страничное приложение в WPF, нужно перестать применять для пользовательских интерфейсов в качестве контейнера высшего уровня класс Window и вместо него переключиться на класс System.Windows.Controls.Page.

Модель для создания страниц в WPF во многом похожа на модель для создания окон. Хотя создавать объекты страниц можно и с помощью одного лишь кода, обычно для каждой страницы создается файл XAML и файл отделенного кода. При компиляции этого приложения компилятор создает производный класс страницы, который объединяет написанный разработчиком код с генерируемыми автоматически связующими элементами (такими как поля, которые ссылаются на каждый именованный элемент на странице).

Страницу можно добавлять в любой проект WPF. Для этого в Visual Studio нужно выбрать в меню Project (Проект) пункт Add Page (Добавить страницу). Хотя страницы и являются самым высокоуровневым компонентом пользовательского интерфейса при проектировании приложения, во время его выполнения контейнером наивысшего уровня они уже не будут. Вместо этого они обслуживаются в другом контейнере. Именно в этом и состоит секрет гибкости, обеспечиваемой WPF в случае страничных приложений, ведь в качестве такого контейнера WPF позволяет использовать любой из нескольких следующих объектов:

объект NavigationWindow, который представляет собой немного видоизмененную версию класса Window;

объект Frame, находящийся внутри другого окна;

объект Frame, находящийся внутри другой страницы;

объект Frame, обслуживаемый непосредственно в Internet Explorer или Firefox.

В качестве примера простейшего страничного приложения давайте создадим следующую страницу:

Теперь изменим содержимое файла App.xaml так, чтобы в качестве начальной страницы использовался файл этой страницы:

При запуске этого приложения среде WPF хватит «интеллектуальных способностей», чтобы понять, что указывается страница, а не окно. Она автоматически создаст новый объект NavigationWindow для выполнения роли контейнера и отобразит страницу внутри него. Она также считает свойство WindowTitle и использует его значение в качестве заголовка окна:

Одно из отличий между страницей и окном заключается в том, что размер страницы обычно не устанавливается, поскольку он определяется обслуживающим ее контейнером (хостом). Если же для свойств Width и Height страницы все-таки указаны какие-то значения, страница делается именно такого размера, но часть ее содержимого может быть усечена, если размер окна хоста оказывается меньше, или размещена по центру доступного пространства, если его размер больше.

Объект NavigationWindow более или менее похож на обычное окно, за исключением кнопок навигации «вперед» и «назад», которые отображаются в строке сверху. Поэтому нетрудно догадаться, что класс NavigationWindow унаследован от класса Window и имеет небольшой дополнительный набор связанных с навигацией свойств. Извлечь ссылку на содержащий объект NavigationWindow можно с помощью следующего кода:

В конструкторе страницы данный код работать не будет, потому что на этом этапе страница пока еще не находится внутри своего контейнера, поэтому нужно дождаться хотя бы, когда возникнет событие Page.Loaded.

По возможности подхода с применением NavigationWindow лучше вообще избегать и использовать вместо него свойства класса Page (и службу навигации). Иначе страница будет тесно связана с контейнером NavigationWindow, и потому ее нельзя будет использовать повторно в других хостах.

При желании создать приложение, состоящее только из кода, для достижения эффекта, показанного на рисунке выше, потребовалось бы создать как страницу, так и навигационное окно. Код, который пришлось бы для этого использовать, показан ниже:

Класс Page

Подобно Window, класс Page допускает наличие только единственного вложенного элемента. Однако класс Page не является элементом управления содержимым: он на самом деле унаследован непосредственно от класса FrameworkElement. Вдобавок класс Page является более простым и отлаженным, чем класс Window. Он имеет небольшой набор дополнительных свойств, которые позволяют настраивать его внешний вид, взаимодействовать с контейнером только определенным, ограниченным образом и применять навигацию. Все эти свойства перечислены ниже:

Background

Принимает кисть, которая позволяет устанавливать заливку для фона

Content

Принимает один элемент, который отображается на странице. Обычно в роли такого элемента выступает контейнер компоновки, такой как Grid или StackPanel

Foreground, FontFamily и FontSize

Определяют внешний вид по умолчанию для текста внутри страницы. Значения этих свойств наследуются элементами внутри страницы. Например, если устанавливается заливка переднего плана и размер шрифта, по умолчанию содержимое внутри страницы получает эти же настройки

WindowWidth, WindowHeight и WindowTitle

Определяют внешний вид окна, в которое упаковывается страница. Эти свойства позволяют управлять хостом путем установки его ширины, высоты и заголовка. Однако они действуют только в том случае, если страница обслуживается в окне (а не во фрейме)

NavigationService

Возвращает ссылку на объект NavigationService, которую можно использовать для отправки пользователя на другую страницу программным путем

KeepAlive

Определяет, должен ли объект страницы оставаться действующим после перехода пользователя на другую страницу.

ShowsNavigationUI

Определяет, должен ли хост для данной страницы отображать навигационные элементы управления (кнопки «назад» и «вперед»). По умолчанию имеет значение true

Title

Устанавливает имя, которое должно применяться для страницы в хронологии навигации. Хост не использует свойство Title для установки заголовка в строке заголовка: для этой цели у него есть свойство WindowTitle

Также важно обратить внимание на отсутствующие компоненты — в классе Page нет эквивалентов для методов Hide() и Show(), доступных в классе Window. Если потребуется показать другую страницу, придется воспользоваться навигацией.

Controls for Windows apps

In Windows app development, a control is a UI element that displays content or enables interaction. Controls are the building blocks of the user interface. A pattern is a recipe for combining several controls to make something new.

We provide 45+ controls for you to use, ranging from simple buttons to powerful data controls like the grid view. These controls are a part of the Fluent Design System and can help you create a bold, scalable UI that looks great on all devices and screen sizes.

The articles in this section provide design guidance and coding instructions for adding controls & patterns to your Windows app.

Intro

General instructions and code examples for adding and styling controls in XAML and C#.

Add controls and handle events
There are 3 key steps to adding controls to your app: Add a control to your app UI, set properties on the control, and add code to the control’s event handlers so that it does something.

Styling controls
You can customize the appearance of your apps in many ways by using the XAML framework. Styles let you set control properties and reuse those settings for a consistent appearance across multiple controls.

Get the Windows UI Library

Some controls are only available in the Windows UI Library (WinUI), a NuGet package that contains new controls and UI features. To get it, see the Windows UI Library overview and installation instructions.
Starting with WinUI 2.2, the default style for many controls has been updated to use rounded corners. For more info, see Corner radius.

Alphabetical index

Detailed information about specific controls and patterns.

  • Animated visual player (see Lottie)
  • Auto-suggest box
  • Button
  • Calendar date picker
  • Calendar view
  • Checkbox
  • Color picker
  • Combo box
  • Command bar
  • Command bar flyout
  • Contact card
  • Content dialog
  • Content link
  • Context menu
  • Date picker
  • Dialogs and flyouts
  • Drop down button
  • Flip view
  • Flyout
  • Forms (pattern)
  • Grid view
  • Hyperlink
  • Hyperlink button
  • Images and image brushes
  • Inking controls
  • List/details (pattern)
  • List view
  • Map control
  • Media playback
  • Menu bar
  • Menu flyout
  • Navigation view
  • Number box
  • Parallax view
  • Password box
  • Person picture
  • Pivot
  • Progress bar
  • Progress ring
  • Radio button
  • Rating control
  • Repeat button
  • Rich edit box
  • Rich text block
  • Scroll viewer
  • Search (pattern)
  • Semantic zoom
  • Shapes
  • Slider
  • Split button
  • Split view
  • Swipe control
  • Tab view
  • Teaching tip
  • Text block
  • Text box
  • Time picker
  • Toggle switch
  • Toggle button
  • Toggle split button
  • Tooltips
  • Tree view
  • Two-pane view
  • Web view

Get the XAML Controls Gallery app from the Microsoft Store to see these controls and the Fluent Design System in action. The app is an interactive companion to this website. When you have it installed, you can use links on individual control pages to launch the app and see the control in action.

Additional controls

Additional controls for Windows development are available from companies such as Telerik, SyncFusion, DevExpress, Infragistics, ComponentOne, and ActiPro. These controls provide additional support for enterprise and .NET developers by augmenting the standard system controls with custom controls and services.

Общие сведения о переходах Navigation Overview

Windows Presentation Foundation (WPF) поддерживает навигацию в стиле браузера, которую можно использовать в приложениях двух типов: автономные приложения и приложения браузера XAML (XBAP). Windows Presentation Foundation (WPF) supports browser-style navigation that can be used in two types of applications: standalone applications and XAML browser applications (XBAPs). Чтобы упаковать содержимое для навигации, WPF предоставляет Page класс. To package content for navigation, WPF provides the Page class. Можно осуществлять переход от одного Page к другому декларативно, с помощью Hyperlink или программно с помощью NavigationService . You can navigate from one Page to another declaratively, by using a Hyperlink, or programmatically, by using the NavigationService. WPF использует журнал для запоминания страниц, которые были перемещены из, и для перехода к ним. WPF uses the journal to remember pages that have been navigated from and to navigate back to them.

Page, Hyperlink , NavigationService , и журнал образуют основу поддержки навигации, предоставляемой WPF. Page, Hyperlink, NavigationService, and the journal form the core of the navigation support offered by WPF. В этом обзоре подробно рассматриваются эти функции, прежде чем будет рассмотрена поддержка расширенной навигации, включающая навигацию по свободным Язык XAML Extensible Application Markup Language (XAML) файлам, ФАЙЛАМ HTML и объектам. This overview explores these features in detail before covering advanced navigation support that includes navigation to loose Язык XAML Extensible Application Markup Language (XAML) files, HTML files, and objects.

В этом разделе термин «браузер» относится только к браузерам, в которых могут размещаться приложения WPF, которые в настоящее время включают в себя Microsoft Internet Explorer и Firefox. In this topic, the term «browser» refers only to browsers that can host WPF applications, which currently includes Microsoft Internet Explorer and Firefox. Если конкретные функции WPF поддерживаются только определенным браузером, то ссылка на версию обозревателя называется. Where specific WPF features are supported only by a particular browser, the browser version is referred to.

Переходы в приложениях WPF Navigation in WPF Applications

В этом разделе представлен обзор основных возможностей навигации в WPF. This topic provides an overview of the key navigation capabilities in WPF. Эти возможности доступны как для автономных приложений, так и для XBAP, хотя в этом разделе они представлены в контексте XBAP. These capabilities are available to both standalone applications and XBAPs, although this topic presents them within the context of an XBAP.

В этом разделе не рассматривается создание и развертывание XBAP. This topic doesn’t discuss how to build and deploy XBAPs. Дополнительные сведения о XBAP см. в разделе Общие сведения о приложениях браузера WPF XAML. For more information on XBAPs, see WPF XAML Browser Applications Overview.

В этом разделе объясняются и демонстрируются следующие аспекты переходов. This section explains and demonstrates the following aspects of navigation:

Реализация страницы Implementing a Page

В WPF можно переходить к нескольким типам содержимого, которые включают платформа .NET Framework объекты, пользовательские объекты, значения перечисления, пользовательские элементы управления, XAML XAML файлы и HTML-файлы. In WPF, you can navigate to several content types that include .NET Framework objects, custom objects, enumeration values, user controls, XAML XAML files, and HTML files. Однако вы обнаружите, что наиболее распространенным и удобным способом упаковки содержимого является использование Page . However, you’ll find that the most common and convenient way to package content is by using Page. Кроме того, Page реализует функции, связанные с навигацией, для улучшения их внешнего вида и упрощения разработки. Furthermore, Page implements navigation-specific features to enhance their appearance and simplify development.

Читайте также:  Не запускается служба центра обеспечения безопасности windows

С помощью Page можно декларативно реализовать страницу навигации с XAML XAML содержимым с помощью разметки, как в следующем примере. Using Page, you can declaratively implement a navigable page of XAML XAML content by using markup like the following.

Объект Page , реализованный в XAML XAML разметке, имеет Page как корневой элемент и требует объявления пространства имен XML WPF. A Page that is implemented in XAML XAML markup has Page as its root element and requires the WPF XML namespace declaration. Page Элемент содержит содержимое, к которому необходимо перейти и отобразить. The Page element contains the content that you want to navigate to and display. Содержимое добавляется путем установки Page.Content элемента свойства, как показано в следующей разметке. You add content by setting the Page.Content property element, as shown in the following markup.

Page.Content может содержать только один дочерний элемент; как предложено в предыдущем примере, содержимым является отдельная строка «Hello, Page!». Page.Content can only contain one child element; in the preceding example, the content is a single string, «Hello, Page!» На практике элемент управления макета обычно используется как дочерний элемент (см. Макет) для хранения и составления содержимого. In practice, you will usually use a layout control as the child element (see Layout) to contain and compose your content.

Дочерние элементы Page элемента считаются содержимым Page и, следовательно, не нужно использовать явное Page.Content объявление. The child elements of a Page element are considered to be the content of a Page and, consequently, you don’t need to use the explicit Page.Content declaration. Следующая разметка является декларативным эквивалентом предыдущего примера. The following markup is the declarative equivalent to the preceding sample.

В этом случае Page.Content автоматически задается дочерними элементами Page элемента. In this case, Page.Content is automatically set with the child elements of the Page element. Дополнительные сведения см. в разделе Модель содержимого WPF. For more information, see WPF Content Model.

Только разметка Page полезна для отображения содержимого. A markup-only Page is useful for displaying content. Однако Page может также отображать элементы управления, позволяющие пользователям взаимодействовать со страницей, и может реагировать на взаимодействие с пользователем, обрабатывая события и вызывая логику приложения. However, a Page can also display controls that allow users to interact with the page, and it can respond to user interaction by handling events and calling application logic. Интерактивный объект Page реализуется с помощью сочетания разметки и кода программной части, как показано в следующем примере. An interactive Page is implemented by using a combination of markup and code-behind, as shown in the following example.

Чтобы разрешить совместную работу файла разметки и файла кода программной части, требуется следующая конфигурация. To allow a markup file and code-behind file to work together, the following configuration is required:

В разметке Page элемент должен включать x:Class атрибут. In markup, the Page element must include the x:Class attribute. При сборке приложения существование x:Class в файле разметки заставляет Microsoft Build Engine (MSBuild) создать partial класс, производный от, Page и имеет имя, заданное x:Class атрибутом. When the application is built, the existence of x:Class in the markup file causes Microsoft build engine (MSBuild) to create a partial class that derives from Page and has the name that is specified by the x:Class attribute. Для этого требуется добавить объявление пространства имен XML для XAML XAML схемы ( xmlns:x=»http://schemas.microsoft.com/winfx/2006/xaml» ). This requires the addition of an XML namespace declaration for the XAML XAML schema ( xmlns:x=»http://schemas.microsoft.com/winfx/2006/xaml» ). Созданный partial класс реализует метод InitializeComponent , который вызывается для регистрации событий и задания свойств, реализованных в разметке. The generated partial class implements InitializeComponent , which is called to register the events and set the properties that are implemented in markup.

В коде программной части класс должен быть partial классом с тем же именем, который указан x:Class атрибутом в разметке и должен быть производным от класса Page . In code-behind, the class must be a partial class with the same name that is specified by the x:Class attribute in markup, and it must derive from Page. Это позволяет связать файл кода программной части с partial классом, созданным для файла разметки при сборке приложения (см. раздел Создание приложения WPF). This allows the code-behind file to be associated with the partial class that is generated for the markup file when the application is built (see Building a WPF Application).

В коде программной части Page класс должен реализовывать конструктор, который вызывает InitializeComponent метод. In code-behind, the Page class must implement a constructor that calls the InitializeComponent method. InitializeComponent реализуется созданным классом файла разметки partial для регистрации событий и задания свойств, определенных в разметке. InitializeComponent is implemented by the markup file’s generated partial class to register events and set properties that are defined in markup.

При добавлении нового Page в проект с помощью Visual Studio объект Page реализуется с помощью разметки и кода программной части и включает необходимую конфигурацию для создания связи между файлами разметки и файлов кода программной части, как описано здесь. When you add a new Page to your project using Visual Studio, the Page is implemented using both markup and code-behind, and it includes the necessary configuration to create the association between the markup and code-behind files as described here.

После получения можно Page переходить к нему. Once you have a Page, you can navigate to it. Чтобы указать первый Page , к которому приложение переходит, необходимо настроить запуск Page . To specify the first Page that an application navigates to, you need to configure the start Page.

Настройка начальной страницы Configuring a Start Page

Для XBAP требуется определенное количество инфраструктуры приложений, размещаемых в браузере. XBAPs require a certain amount of application infrastructure to be hosted in a browser. В WPF Application класс является частью определения приложения, которое устанавливает необходимую инфраструктуру приложений (см. Обзор управления приложениями). In WPF, the Application class is part of an application definition that establishes the required application infrastructure (see Application Management Overview).

Определение приложения обычно реализуется с помощью разметки и кода программной части с файлом разметки, настроенным в качестве ApplicationDefinition элемента MSBuild. An application definition is usually implemented using both markup and code-behind, with the markup file configured as an MSBuild ApplicationDefinition item. Ниже приведено определение приложения для XBAP. The following is an application definition for an XBAP.

XBAP может использовать определение приложения для указания запуска Page , который Page автоматически загружается при запуске XBAP. An XBAP can use its application definition to specify a start Page, which is the Page that is automatically loaded when the XBAP is launched. Это можно сделать, задав StartupUri свойству универсальный код ресурса (URI) для требуемого значения Page . You do this by setting the StartupUri property with the uniform resource identifier (URI) for the desired Page.

В большинстве случаев объект Page либо компилируется в приложение, либо развертывается вместе с ним. In most cases, the Page is either compiled into or deployed with an application. В этих случаях URI, определяющий, Page — это URI типа «Pack», который соответствует схеме Pack . In these cases, the URI that identifies a Page is a pack URI, which is a URI that conforms to the pack scheme. URI типа «Pack» обсуждаются далее в URI типа » Pack» в WPF. Pack URIs are discussed further in Pack URIs in WPF. Для перехода к содержимому можно также использовать схему HTTP, которая рассматривается далее. You can also navigate to content using the http scheme, which is discussed below.

Можно задать StartupUri декларативно в разметке, как показано в следующем примере. You can set StartupUri declaratively in markup, as shown in the following example.

В этом примере StartupUri атрибут задается с помощью относительного URI типа Pack, определяющего Homepage. XAML. In this example, the StartupUri attribute is set with a relative pack URI that identifies HomePage.xaml. При запуске XBAP автоматически осуществляется переход на страницу HomePage. XAML и ее отображение. When the XBAP is launched, HomePage.xaml is automatically navigated to and displayed. Это продемонстрировано на следующем рисунке, в котором показан XBAP, запущенный с веб-сервера. This is demonstrated by the following figure, which shows an XBAP that was launched from a Web server.

Дополнительные сведения о разработке и развертывании XBAP см. в разделе Общие сведения о приложениях браузера WPF XAML и развертывании приложения WPF. For more information regarding the development and deployment of XBAPs, see WPF XAML Browser Applications Overview and Deploying a WPF Application.

Настройка заголовка, ширины и высоты основного окна Configuring the Host Window’s Title, Width, and Height

Первое, что вы могли заметить на предыдущем рисунке, заключается в том, что заголовок в браузере и на панели вкладок является универсальным кодом ресурса (URI) для XBAP. One thing you may have noticed from the previous figure is that the title of both the browser and the tab panel is the URI for the XBAP. Заголовок не только длинный, но также не является ни привлекательным, ни информативным. Besides being long, the title is neither attractive nor informative. По этой причине Page предлагает способ изменить заголовок, задав WindowTitle свойство. For this reason, Page offers a way for you to change the title by setting the WindowTitle property. Кроме того, можно настроить ширину и высоту окна браузера, установив WindowWidth и WindowHeight соответственно. Furthermore, you can configure the width and height of the browser window by setting WindowWidth and WindowHeight, respectively.

WindowTitle, WindowWidth и WindowHeight могут быть заданы декларативно в разметке, как показано в следующем примере. WindowTitle, WindowWidth, and WindowHeight can be set declaratively in markup, as shown in the following example.

Результат показан на примере ниже. The result is shown in the following figure.

Типичный XBAP состоит из нескольких страниц. A typical XBAP comprises several pages. Самый простой способ перехода с одной страницы на другой — использовать Hyperlink . The simplest way to navigate from one page to another is to use a Hyperlink. Можно декларативно добавить Hyperlink в объект, Page используя Hyperlink элемент, который показан в следующей разметке. You can declaratively add a Hyperlink to a Page by using the Hyperlink element, which is shown in the following markup.

Для Hyperlink элемента требуется следующее: A Hyperlink element requires the following:

URI типа Pack для Page перехода в, как указано в NavigateUri атрибуте. The pack URI of the Page to navigate to, as specified by the NavigateUri attribute.

Содержимое, которое пользователь может щелкнуть для инициации навигации, например текст и изображения (для содержимого, которое Hyperlink может содержать элемент, см. раздел Hyperlink ). Content that a user can click to initiate the navigation, such as text and images (for the content that the Hyperlink element can contain, see Hyperlink).

На следующем рисунке показан XBAP с Page Hyperlink . The following figure shows an XBAP with a Page that has a Hyperlink.

Как и следовало бы ожидания, нажатие кнопки Hyperlink вызывает переход XBAP к объекту Page , определяемому NavigateUri атрибутом. As you would expect, clicking the Hyperlink causes the XBAP to navigate to the Page that is identified by the NavigateUri attribute. Кроме того, XBAP добавляет запись для предыдущего Page списка «Последние страницы» в Internet Explorer. Additionally, the XBAP adds an entry for the previous Page to the Recent Pages list in Internet Explorer. Это показано на следующем рисунке. This is shown in the following figure.

А также поддержка переходов от одного Page к другому, Hyperlink также поддерживает навигацию по фрагментам. As well as supporting navigation from one Page to another, Hyperlink also supports fragment navigation.

Переход к фрагменту Fragment Navigation

Навигация по фрагментам — это переход к фрагменту содержимого в текущем Page или другом Page . Fragment navigation is the navigation to a content fragment in either the current Page or another Page. В WPF фрагмент содержимого — это содержимое, содержащееся в именованном элементе. In WPF, a content fragment is the content that is contained by a named element. Именованный элемент — это элемент с Name установленным атрибутом. A named element is an element that has its Name attribute set. В следующей разметке показан именованный TextBlock элемент, содержащий фрагмент содержимого. The following markup shows a named TextBlock element that contains a content fragment.

Для Hyperlink перехода к фрагменту содержимого NavigateUri атрибут должен включать следующее: For a Hyperlink to navigate to a content fragment, the NavigateUri attribute must include the following:

Универсальный код ресурса (URI) Page с фрагментом содержимого, к которому необходимо выполнить переход. The URI of the Page with the content fragment to navigate to.

Символ «#». A «#» character.

Имя элемента Page , содержащего фрагмент содержимого. The name of the element on the Page that contains the content fragment.

Читайте также:  Аналог baobab для windows

URI фрагмента имеет следующий формат. A fragment URI has the following format.

URI_страницы # имя_элемента. PageURI # ElementName

Ниже приведен пример Hyperlink , который настроен для перехода к фрагменту содержимого. The following shows an example of a Hyperlink that is configured to navigate to a content fragment.

В этом разделе описывается реализация навигации по умолчанию для фрагментов в WPF. This section describes the default fragment navigation implementation in WPF. WPF также позволяет реализовать собственную схему навигации по фрагментам, которая, в свою часть, требует обработки NavigationService.FragmentNavigation события. WPF also allows you to implement your own fragment navigation scheme which, in part, requires handling the NavigationService.FragmentNavigation event.

Можно перейти к фрагментам на несвободных XAML XAML страницах (файлы только разметки XAML XAML с Page корневым элементом), только если страницы можно просматривать по протоколу HTTP. You can navigate to fragments in loose XAML XAML pages (markup-only XAML XAML files with Page as the root element) only if the pages can be browsed via HTTP.

Однако свободная XAML XAML страница может переходить к собственным фрагментам. However, a loose XAML XAML page can navigate to its own fragments.

Служба переходов Navigation Service

Хотя Hyperlink позволяет пользователю инициировать навигацию по конкретному Page , работа по поиску и скачиванию страницы выполняется NavigationService классом. While Hyperlink allows a user to initiate navigation to a particular Page, the work of locating and downloading the page is performed by the NavigationService class. По сути, NavigationService предоставляет возможность обработки запроса навигации от имени клиентского кода, например Hyperlink . Essentially, NavigationService provides the ability to process a navigation request on behalf of client code, such as the Hyperlink. Кроме того, NavigationService реализует поддержку более высокого уровня для отслеживания и влияния на запрос навигации. Additionally, NavigationService implements higher-level support for tracking and influencing a navigation request.

При Hyperlink нажатии кнопки WPF вызывает метод, NavigationService.Navigate чтобы нахождение и скачивание по Page указанному URI типа pack. When a Hyperlink is clicked, WPF calls NavigationService.Navigate to locate and download the Page at the specified pack URI. Загруженный файл Page преобразуется в дерево объектов, корневой объект которых является экземпляром скачанного Page . The downloaded Page is converted to a tree of objects whose root object is an instance of the downloaded Page. Ссылка на корневой Page объект хранится в NavigationService.Content свойстве. A reference to the root Page object is stored in the NavigationService.Content property. URI типа «Pack» для содержимого, к которому осуществлялся переход, хранится в NavigationService.Source свойстве, а в NavigationService.CurrentSource хранится URI типа «Pack» для последней страницы, к которой был выполнен переход. The pack URI for the content that was navigated to is stored in the NavigationService.Source property, while the NavigationService.CurrentSource stores the pack URI for the last page that was navigated to.

Приложение WPF может иметь более одного активного в данный момент NavigationService . It is possible for a WPF application to have more than one currently active NavigationService. Дополнительные сведения см. в подразделе узлы навигации далее в этой статье. For more information, see Navigation Hosts later in this topic.

Программный переход с помощью службы переходов Programmatic Navigation with the Navigation Service

Вам не нужно знать о том NavigationService , реализована ли Навигация декларативно в разметке с помощью Hyperlink , поскольку Hyperlink использует от NavigationService вашего имени. You don’t need to know about NavigationService if navigation is implemented declaratively in markup using Hyperlink, because Hyperlink uses the NavigationService on your behalf. Это означает, что, если прямой или непрямой родительский элемент a Hyperlink является узлом навигации (см. раздел навигационные узлы), сможет Hyperlink найти и использовать службу навигации узла навигации для обработки запроса навигации. This means that, as long as either the direct or indirect parent of a Hyperlink is a navigation host (see Navigation Hosts), Hyperlink will be able to find and use the navigation host’s navigation service to process a navigation request.

Однако существуют ситуации, когда необходимо использовать NavigationService напрямую, включая следующие. However, there are situations when you need to use NavigationService directly, including the following:

Если необходимо создать экземпляр Page с использованием конструктора без параметров. When you need to instantiate a Page using a non-parameterless constructor.

Если необходимо задать свойства для, Page прежде чем переходить к нему. When you need to set properties on the Page before you navigate to it.

Если нужно выполнить Page Переход к, можно определить только во время выполнения. When the Page that needs to be navigated to can only be determined at run time.

В таких ситуациях необходимо написать код для программной инициации навигации путем вызова Navigate метода NavigationService объекта. In these situations, you need to write code to programmatically initiate navigation by calling the Navigate method of the NavigationService object. Для этого требуется получить ссылку на NavigationService . That requires getting a reference to a NavigationService.

Получение ссылки на службу переходов Getting a Reference to the NavigationService

По причинам, описанным в разделе узлы навигации , приложение WPF может иметь более одного NavigationService . For reasons that are covered in the Navigation Hosts section, a WPF application can have more than one NavigationService. Это означает, что вашему коду нужен способ поиска NavigationService , который обычно используется NavigationService для перехода к текущему Page . This means that your code needs a way to find a NavigationService, which is usually the NavigationService that navigated to the current Page. Чтобы получить ссылку на, можно NavigationService вызвать static NavigationService.GetNavigationService метод. You can get a reference to a NavigationService by calling the static NavigationService.GetNavigationService method. Чтобы получить объект NavigationService , который переходит к определенному объекту Page , в Page качестве аргумента метода передается ссылка GetNavigationService . To get the NavigationService that navigated to a particular Page, you pass a reference to the Page as the argument of the GetNavigationService method. В следующем коде показано, как получить NavigationService для текущего Page . The following code shows how to get the NavigationService for the current Page.

В качестве ярлыка для поиска NavigationService для Page , Page реализует NavigationService свойство. As a shortcut for finding the NavigationService for a Page, Page implements the NavigationService property. Это показано в следующем примере. This is shown in the following example.

Page NavigationService При Page вызове события может получиться только ссылка на него Loaded . A Page can only get a reference to its NavigationService when Page raises the Loaded event.

Программный переход к объекту страницы Programmatic Navigation to a Page Object

В следующем примере показано, как использовать NavigationService для программного перехода к Page . The following example shows how to use the NavigationService to programmatically navigate to a Page. Программная Навигация необходима, так как Page для перехода к которому можно создать экземпляр только с помощью одного конструктора без параметров. Programmatic navigation is required because the Page that is being navigated to can only be instantiated using a single, non-parameterless constructor. Объект Page с конструктором без параметров показан в следующей разметке и коде. The Page with the non-parameterless constructor is shown in the following markup and code.

Объект Page , который переходит к элементу Page с конструктором без параметров, показан в следующей разметке и коде. The Page that navigates to the Page with the non-parameterless constructor is shown in the following markup and code.

При Hyperlink Page нажатии кнопки переход инициируется путем создания экземпляра Page компонента для перехода к использованию конструктора без параметров и вызова NavigationService.Navigate метода. When the Hyperlink on this Page is clicked, navigation is initiated by instantiating the Page to navigate to using the non-parameterless constructor and calling the NavigationService.Navigate method. Navigate принимает ссылку на объект, NavigationService к которому будет переходить, а не к URI типа pack. Navigate accepts a reference to the object that the NavigationService will navigate to, rather than a pack URI.

Программный переход с URI типа pack Programmatic Navigation with a Pack URI

Если необходимо создать URI типа «Pack» программным способом (например, при определении URI типа «Pack» во время выполнения), можно использовать NavigationService.Navigate метод. If you need to construct a pack URI programmatically (when you can only determine the pack URI at run time, for example), you can use the NavigationService.Navigate method. Это показано в следующем примере. This is shown in the following example.

Обновление текущей страницы Refreshing the Current Page

Объект Page не загружается, если он имеет тот же URI типа Pack, что и URI типа Pack, хранящийся в NavigationService.Source свойстве. A Page is not downloaded if it has the same pack URI as the pack URI that is stored in the NavigationService.Source property. Чтобы принудительно загрузить текущую страницу в WPF, можно вызвать NavigationService.Refresh метод, как показано в следующем примере. To force WPF to download the current page again, you can call the NavigationService.Refresh method, as shown in the following example.

Время существования перехода Navigation Lifetime

Как вы уже видели, существует множество способов инициации перехода. There are many ways to initiate navigation, as you’ve seen. При инициации навигации и при выполнении навигации можно отслеживать и повлиять на навигацию с помощью следующих событий, реализуемых NavigationService : When navigation is initiated, and while navigation is in progress, you can track and influence the navigation using the following events that are implemented by NavigationService:

Navigating. Navigating. Появляется, когда запрошен новый переход. Occurs when a new navigation is requested. Можно использовать для отмены перехода. Can be used to cancel the navigation.

NavigationProgress. NavigationProgress. Происходит периодически во время загрузки, тем самым предоставляя информацию о ходе процесса навигации. Occurs periodically during a download to provide navigation progress information.

Navigated. Navigated. Появляется, когда страница найдена и загружена. Occurs when the page has been located and downloaded.

NavigationStopped. NavigationStopped. Происходит при остановке навигации (путем вызова StopLoading ) или при запросе новой навигации во время выполнения текущей навигации. Occurs when the navigation is stopped (by calling StopLoading), or when a new navigation is requested while a current navigation is in progress.

NavigationFailed. NavigationFailed. Появляется при возникновении ошибки во время перехода к запрошенному содержимому. Occurs when an error is raised while navigating to the requested content.

LoadCompleted. LoadCompleted. Появляется, когда содержимое, к которому был осуществлен переход, загружено и проанализировано и начинается его отрисовка. Occurs when content that was navigated to is loaded and parsed, and has begun rendering.

FragmentNavigation. FragmentNavigation. Появляется в начале перехода к фрагменту содержимого, который происходит: Occurs when navigation to a content fragment begins, which happens:

немедленно, если нужный фрагмент находится в текущем содержимом; Immediately, if the desired fragment is in the current content.

после загрузки исходного содержимого, если нужный фрагмент находится в другом содержимом. After the source content has been loaded, if the desired fragment is in different content.

События перехода вызываются в порядке, который показан на следующем рисунке. The navigation events are raised in the order that is illustrated by the following figure.

Как правило, это Page не касается этих событий. In general, a Page isn’t concerned about these events. Более вероятно, что приложение связано с ними, и по этой причине эти события также вызываются Application классом: It is more likely that an application is concerned with them and, for that reason, these events are also raised by the Application class:

Каждый раз при NavigationService вызове события Application класс вызывает соответствующее событие. Every time NavigationService raises an event, the Application class raises the corresponding event. Frame и NavigationWindow предлагают те же события для обнаружения переходов в соответствующих областях. Frame and NavigationWindow offer the same events to detect navigation within their respective scopes.

В некоторых случаях Page может заинтересовать эти события. In some cases, a Page might be interested in these events. Например, Page может обработано NavigationService.Navigating событие, чтобы определить, следует ли отменить переход от самого себя. For example, a Page might handle the NavigationService.Navigating event to determine whether or not to cancel navigation away from itself. Это показано в следующем примере. This is shown in the following example.

При регистрации обработчика с событием навигации из Page , как в предыдущем примере, необходимо также отменить регистрацию обработчика событий. If you register a handler with a navigation event from a Page, as the preceding example does, you must also unregister the event handler. В противном случае могут возникнуть побочные эффекты в отношении того, как Навигация WPF запоминает Page навигацию с помощью журнала. If you don’t, there may be side effects with respect to how WPF navigation remembers Page navigation using the journal.

Запоминание перехода в журнале Remembering Navigation with the Journal

WPF использует два стека для запоминания страниц, из которых вы перешли: стек назад и прямой стек. WPF uses two stacks to remember the pages that you have navigated from: a back stack and a forward stack. При переходе от текущего объекта Page к новому Page или пересылке к существующему объекту Page , текущий Page добавляется в стек назад. When you navigate from the current Page to a new Page or forward to an existing Page, the current Page is added to the back stack. При переходе от текущего момента Page к предыдущему Page , текущее значение Page добавляется в стек вперед. When you navigate from the current Page back to the previous Page, the current Page is added to the forward stack. Стек «Назад», стек «Вперед» и функциональные возможности для управления ими в совокупности называются журналом. The back stack, the forward stack, and the functionality to manage them, are collectively referred to as the journal. Каждый элемент в стеке заднего и прямого стека является экземпляром JournalEntry класса и называется записью в журнале. Each item in the back stack and the forward stack is an instance of the JournalEntry class, and is referred to as a journal entry.

Перемещение по журналу в браузере Internet Explorer Navigating the Journal from Internet Explorer

По сути, журнал работает так же, как кнопки назад и вперед в Internet Explorer. Conceptually, the journal operates the same way that the Back and Forward buttons in Internet Explorer do. Это показано на следующем рисунке. These are shown in the following figure.

Читайте также:  Не меняется владелец папки windows 10

Для XBAP, размещенных в Internet Explorer, WPF интегрирует журнал в навигацию по UI UI Internet Explorer. For XBAPs that are hosted by Internet Explorer, WPF integrates the journal into the navigation UI UI of Internet Explorer. Это позволяет пользователям перемещаться по страницам в XBAP с помощью кнопок назад, вперед и Последние страницы в Internet Explorer. This allows users to navigate pages in an XBAP by using the Back, Forward, and Recent Pages buttons in Internet Explorer.

В Internet Explorer, когда пользователь отключается от XBAP и возвращается к нему, только записи журнала для страниц, которые не были сохранены в активном состоянии, сохраняются в журнале. In Internet Explorer, when a user navigates away from and back to an XBAP, only the journal entries for pages that were not kept alive are retained in the journal. Сведения о сохранении страниц в активном состоянии см. в разделе время существования страницы и журнал далее в этой статье. For discussion on keeping pages alive, see Page Lifetime and the Journal later in this topic.

По умолчанию текст Page , отображаемый в списке Последние страницы Internet Explorer, является универсальным кодом ресурса (URI) для Page . By default, the text for each Page that appears in the Recent Pages list of Internet Explorer is the URI for the Page. В большинстве случаев это не особенно важно для пользователя. In many cases, this is not particularly meaningful to the user. К счастью можно изменить текст, используя следующие параметры. Fortunately, you can change the text using one the following options:

Значение присоединенного JournalEntry.Name атрибута. The attached JournalEntry.Name attribute value.

Page.Title Значение атрибута. The Page.Title attribute value.

Page.WindowTitle Значение атрибута и универсальный код ресурса (URI) для текущего Page . The Page.WindowTitle attribute value and the URI for the current Page.

Универсальный код ресурса (URI) для текущего Page . The URI for the current Page. (по умолчанию) (Default)

Порядок, в котором перечислены параметры, совпадает с порядком приоритета для поиска текста. The order in which the options are listed matches the order of precedence for finding the text. Например, если JournalEntry.Name задано значение, другие значения игнорируются. For example, if JournalEntry.Name is set, the other values are ignored.

В следующем примере атрибут используется Page.Title для изменения текста, отображаемого для записи журнала. The following example uses the Page.Title attribute to change the text that appears for a journal entry.

Перемещение по журналу с помощью WPF Navigating the Journal Using WPF

Хотя пользователь может перемещаться по журналу с помощью страниц « назад», « вперед» и « последние » в Internet Explorer, можно также перемещаться по журналу с помощью декларативных и программных механизмов, предоставляемых WPF. Although a user can navigate the journal by using the Back, Forward, and Recent Pages in Internet Explorer, you can also navigate the journal using both declarative and programmatic mechanisms provided by WPF. Одной из причин для этого является предоставление пользовательских интерфейсов навигации на страницах. One reason to do this is to provide custom navigation UIs in your pages.

Можно декларативно добавить поддержку навигации по журналам с помощью команд навигации, предоставляемых NavigationCommands . You can declaratively add journal navigation support by using the navigation commands exposed by NavigationCommands. В следующем примере показано, как использовать BrowseBack команду навигации. The following example demonstrates how to use the BrowseBack navigation command.

Можно программно перемещаться по журналу с помощью одного из следующих членов NavigationService класса: You can programmatically navigate the journal by using one of the following members of the NavigationService class:

Журнал также можно манипулировать программно, как описано в статье Сохранение состояния содержимого с помощью журнала переходов далее в этом разделе. The journal can also be manipulated programmatically, as discussed in Retaining Content State with Navigation History later in this topic.

Время существования страницы и журнал Page Lifetime and the Journal

Рассмотрим XBAP с несколькими страницами, содержащими обширное содержимое, включая графику, анимацию и мультимедиа. Consider an XBAP with several pages that contain rich content, including graphics, animations, and media. Объем памяти для подобных страниц может быть довольно большим, особенно если используются видеоматериалы и звуковые файлы. The memory footprint for pages like these could be quite large, particularly if video and audio media are used. Учитывая, что журнал «запоминает» страницы, к которым был выполнен переход, может быстро использовать большой и заметный объем памяти. Given that the journal «remembers» pages that have been navigated to, such an XBAP could quickly consume a large and noticeable amount of memory.

По этой причине поведение журнала по умолчанию заключается в хранении Page метаданных в каждой записи журнала, а не в ссылке на Page объект. For this reason, the default behavior of the journal is to store Page metadata in each journal entry rather than a reference to a Page object. При переходе к записи журнала ее Page метаданные используются для создания нового экземпляра указанного объекта Page . When a journal entry is navigated to, its Page metadata is used to create a new instance of the specified Page. Как следствие, каждый Page , к которому осуществляется переход, имеет время существования, показанное на следующем рисунке. As a consequence, each Page that is navigated has the lifetime that is illustrated by the following figure.

Несмотря на то, что использование поведения ведения журнала по умолчанию может сэкономить на потреблении памяти, производительность отрисовки на странице может снизиться; Page при повторном создании экземпляра может потребоваться много времени, особенно если у него много содержимого. Although using the default journaling behavior can save on memory consumption, per-page rendering performance might be reduced; reinstantiating a Page can be time-intensive, particularly if it has a lot of content. Если необходимо хранить Page экземпляр в журнале, можно нарисовать два метода для этого. If you need to retain a Page instance in the journal, you can draw on two techniques for doing so. Во-первых, можно программным путем выполнить переход к Page объекту, вызвав NavigationService.Navigate метод. First, you can programmatically navigate to a Page object by calling the NavigationService.Navigate method.

Во-вторых, можно указать, что WPF будет хранить экземпляр Page в журнале, задав KeepAlive для свойства значение true (значение по умолчанию — false ). Second, you can specify that WPF retain an instance of a Page in the journal by setting the KeepAlive property to true (the default is false ). Как показано в следующем примере, можно задать KeepAlive декларативно в разметке. As shown in the following example, you can set KeepAlive declaratively in markup.

Время существования объекта Page , который хранится в активном состоянии, незначительно отличается от того, который не является. The lifetime of a Page that is kept alive is subtly different from one that is not. PageПри первом переходе к объекту, который хранится в активном состоянии, он создается так же, как и объект Page , который не поддерживается в активном состоянии. The first time a Page that is kept alive is navigated to, it is instantiated just like a Page that is not kept alive. Однако, поскольку экземпляр класса Page хранится в журнале, он никогда не создается повторно в течение времени, пока он остается в журнале. However, because an instance of the Page is retained in the journal, it is never instantiated again for as long as it remains in the journal. Следовательно, если Page имеется логика инициализации, которая должна вызываться при каждом Page переходе к, необходимо переместить его из конструктора в обработчик Loaded события. Consequently, if a Page has initialization logic that needs to be called every time the Page is navigated to, you should move it from the constructor into a handler for the Loaded event. Как показано на следующем рисунке, Loaded Unloaded события и по-прежнему создаются каждый раз, когда Page осуществляется переход к и из соответственно. As shown in the following figure, the Loaded and Unloaded events are still raised each time a Page is navigated to and from, respectively.

Если Page не поддерживается в активном состоянии, не следует выполнять одно из следующих действий. When a Page is not kept alive, you should not do either of the following:

Сохранять ссылку или любую его часть. Store a reference to it, or any part of it.

Регистрировать обработчики событий с событиями, которые не реализованы в объекте. Register event handlers with events that are not implemented by it.

При выполнении любого из этих действий будут созданы ссылки, которые принудительно Page будут сохранены в памяти даже после удаления из журнала. Doing either of these will create references that force the Page to be retained in memory, even after it has been removed from the journal.

Как правило, предпочтительнее использовать поведение по умолчанию, Page не сохраняя Page активность. In general, you should prefer the default Page behavior of not keeping a Page alive. Однако при этом существуют реализации состояния, которые описаны в следующем разделе. However, this has state implications that are discussed in the next section.

Сохранение состояния содержимого с помощью журнала переходов Retaining Content State with Navigation History

Если объект Page не хранится в активном состоянии и содержит элементы управления, собирающие данные от пользователя, что произойдет с данными, если пользователь отрывается от и обратно Page ? If a Page is not kept alive, and it has controls that collect data from the user, what happens to the data if a user navigates away from and back to the Page? С точки зрения пользователя следует ожидать появления ранее введенных данных. From a user experience perspective, the user should expect to see the data they entered previously. К сожалению, поскольку новый экземпляр класса Page создается с каждой навигацией, элементы управления, которые собирают данные, повторно создают экземпляры, а данные теряются. Unfortunately, because a new instance of the Page is created with each navigation, the controls that collected the data are reinstantiated and the data is lost.

К счастью, журнал обеспечивает поддержку для запоминания данных во всех Page переходах, включая управляющие данные. Fortunately, the journal provides support for remembering data across Page navigations, including control data. В частности, запись журнала для каждого Page из них выступает в качестве временного контейнера для связанного Page состояния. Specifically, the journal entry for each Page acts as a temporary container for the associated Page state. Следующие шаги показывают, как эта поддержка используется при Page переходе от: The following steps outline how this support is used when a Page is navigated from:

Запись для текущего объекта Page добавляется в журнал. An entry for the current Page is added to the journal.

Состояние объекта хранится в Page записи журнала для этой страницы, которая добавляется в стек назад. The state of the Page is stored with the journal entry for that page, which is added to the back stack.

Новый Page Переход к. The new Page is navigated to.

При Page переходе назад к странице с помощью журнала выполняются следующие действия. When the page Page is navigated back to, using the journal, the following steps take place:

Создается Page экземпляр (верхняя запись журнала в стеке сзади). The Page (the top journal entry on the back stack) is instantiated.

PageОбновляет состояние, которое было сохранено с записью журнала для Page . The Page is refreshed with the state that was stored with the journal entry for the Page.

PageПереходит обратно к. The Page is navigated back to.

WPF автоматически использует эту поддержку при использовании следующих элементов управления в Page : WPF automatically uses this support when the following controls are used on a Page:

Оцените статью