Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Эта часть руководства добавляет последний элемент в приложение — навигацию между страницей всех заметок и отдельной страницей заметки.
Прежде чем писать любой код для обработки навигации в приложении, давайте опишите ожидаемое поведение навигации.
В AllNotesPage имеется коллекция существующих заметок и кнопка «Создать заметку».
- Щелчок по существующей заметке должен автоматически перенести на страницу заметок и загрузить выбранную заметку.
- При нажатии кнопки "Создать заметку " перейдите на страницу заметок и загрузите пустую несохраняемую заметку.
На странице заметок вы добавите кнопку "Назад ", а кнопки "Сохранить " и "Удалить ".
- Нажатие кнопки "Назад" должно вернуться на страницу всех заметок, отменив любые изменения, внесенные в заметку.
- Нажмите кнопку "Удалить ", чтобы удалить заметку, а затем вернуться назад.
Новая заметка
Сначала вы будете обрабатывать навигацию для новой заметки.
Подсказка
Вы можете скачать или просмотреть код для этого руководства из репозитория GitHub. Чтобы просмотреть код в этом виде на данном этапе, см. этот коммит: навигация — новое примечание.
В AllNotesPage.xaml найдите
AppBarButtonновую заметку.Добавьте обработчик событий
Clickи переименуйте его наNewNoteButton_Click. (См. шаг по добавлению обработчиков событий добавить на странице заметки, если вам потребуется напоминание о том, как это сделать.)<AppBarButton Icon="Add" Label="New note" Click="NewNoteButton_Click"/>NewNoteButton_ClickВ методе (в AllNotesPage.xaml.cs) добавьте следующий код:private void NewNoteButton_Click(object sender, RoutedEventArgs e) { // ↓ Add this. ↓ Frame.Navigate(typeof(NotePage)); }
Каждая страница имеет свойство Frame , которое предоставляет ссылку на экземпляр Frame , к которому Page принадлежит (при наличии). Вот Frame, для которого вы вызываете метод Navigate здесь. Метод Navigate принимает тип страницы, на которую вы хотите перейти. Вы получаете это Type в C# с помощью typeof оператора.
Если вы запускаете приложение сейчас, нажмите кнопку "Создать заметку ", чтобы перейти на страницу заметок, и вы можете ввести его в редактор заметок. Однако если вы попытаетесь сохранить заметку, ничего не произойдет. Это связано с тем, что на странице заметок еще не создан экземпляр модели Note. Теперь вы сделаете это.
Откройте NotePage.xaml.cs.
Добавьте код для переопределения метода OnNavigatedTo страницы.
public NotePage() { this.InitializeComponent(); } // ↓ Add this. ↓ protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); noteModel = new Note(); }
Теперь, когда вы переходите по адресу NotePage, создается новый экземпляр модели Note.
Существующие заметки
Теперь вы добавите навигацию для существующих заметок. В настоящее время при щелчке заметки в элементе ItemsViewвыбрана заметка, но ничего не происходит. Поведение по умолчанию для большинства контролов коллекции — это выбор одного элемента, что означает, что один элемент выбирается за раз. Вы обновите ItemsView, чтобы можно было щелкнуть элемент, например кнопку, вместо того чтобы его выбирать.
Подсказка
Вы можете скачать или просмотреть код для этого руководства из репозитория GitHub. Чтобы увидеть код на этом шаге, ознакомьтесь с этим коммитом: navigation — окончательное приложение.
Откройте AllNotesPage.xaml.
Обновите XAML для
ItemsViewпараметра SelectionMode = None и IsItemInvokedEnabled =True.Добавьте обработчик события ItemInvoked .
<ItemsView ItemsSource="{x:Bind notesModel.Notes}" Grid.Row="1" Margin="24" ItemTemplate="{StaticResource NoteItemTemplate}" <!-- ↓ Add this. ↓ --> SelectionMode="None" IsItemInvokedEnabled="True" ItemInvoked="ItemsView_ItemInvoked">В AllNotesPage.xaml.cs найдите
ItemsView_ItemInvokedметод. (Если Visual Studio не создали его для вас, что может произойти при копировании и вставке кода, добавьте его на следующем шаге.)В методе
ItemsView_ItemInvokedдобавьте код для перехода кNotePage. На этот раз вы будете использовать перегрузку метода Navigate, которая позволяет передать объект на другую страницу. Передайте вызываемыйNoteв качестве второго параметра навигации.private void ItemsView_ItemInvoked(ItemsView sender, ItemsViewItemInvokedEventArgs args) { Frame.Navigate(typeof(NotePage), args.InvokedItem); }Откройте NotePage.xaml.cs.
Обновите переопределение метода
OnNavigatedTo, чтобы обработатьNote, который передается вызовом методаNavigate.protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); // ↓ Update this. ↓ if (e.Parameter is Note note) { noteModel = note; } else { noteModel = new Note(); } // ↑ Update this. ↑ }В этом коде сначала проверяется, является ли переданный параметр объектом. Если выполняется условие, назначьте её моделью
Noteдля страницы. Если этоnullили нетNote, создайте новыйNote, как и раньше.
Обратная навигация
Наконец, необходимо обновить приложение, чтобы вернуться из отдельной заметки на страницу всех заметок.
Элемент управления TitleBar в WinUI 3 включает кнопку назад, которая соответствует всем рекомендациям по проектированию Fluent в части размещения и внешнего вида. Вы будете использовать эту встроенную кнопку для обратной навигации.
Откройте Файл MainWindow.xaml.
Обновите XAML для
TitleBarобъекта IsBackButtonVisible =Trueи IsBackButtonEnabled , привязанного к свойству Frame.CanGoBack .Добавьте обработчик события BackRequested . Код XAML должен выглядеть следующим образом:
<TitleBar x:Name="AppTitleBar" Title="WinUI Notes" IsBackButtonVisible="True" IsBackButtonEnabled="{x:Bind rootFrame.CanGoBack, Mode=OneWay}" BackRequested="AppTitleBar_BackRequested">Здесь для свойства IsBackButtonVisible задано
trueзначение . Это приводит к появлению кнопки "Назад" в левом верхнем углу окна приложения.Затем свойство IsBackButtonEnabled привязано к свойству Frame.CanGoBack , поэтому кнопка "Назад" включена только в том случае, если кадр может вернуться назад.
Наконец, добавляется обработчик событий BackRequested . Здесь размещается код для навигации назад.
В MainWindow.xaml.cs добавьте этот код в
AppTitleBar_BackRequestedметод:private void AppTitleBar_BackRequested(TitleBar sender, object args) { // ↓ Add this. ↓ if (rootFrame.CanGoBack == true) { rootFrame.GoBack(); } // ↑ Add this. ↑ }Класс
Frameотслеживает навигацию в backStack, поэтому вы можете вернуться к предыдущим страницам, просто вызвав метод GoBack . Рекомендуется всегда проверять свойство CanGoBack перед вызовомGoBack.
Затем вам необходимо обновить код в NotePage, чтобы можно было вернуться после удаления заметки.
Откройте NotePage.xaml.cs.
DeleteButton_ClickОбновите метод обработчика событий с вызовомFrame.CanGoBackметода после удаления заметки:private async void DeleteButton_Click(object sender, RoutedEventArgs e) { if (noteModel is not null) { await noteModel.DeleteAsync(); } // ↓ Add this. ↓ if (Frame.CanGoBack == true) { Frame.GoBack(); } // ↑ Add this. ↑ }
Подсказка
Возможно, вы заметили, что в NotePage вызывается Frame.GoBack, тогда как в MainWindow вызывался rootFrame.GoBack. Это связано с тем, что класс Page имеет свойство Frame, которое получает Frame, размещающий Page, если он существует. В этом случае он получает ссылку на rootFrame.
Теперь вы можете запустить приложение. Попробуйте добавить новые заметки, перейти между заметками и удалить их.
Дополнительные сведения см. в документации:
- Реализация навигации между двумя страницами
- журнал навигации и обратная навигация
- Класс Frame, класс Page
Дальнейшие шаги
Поздравляю! Вы завершили руководство по созданию приложения WinUI !
Следующие ссылки содержат дополнительные сведения о создании приложений с помощью WinUI и Windows App SDK:
Windows developer