Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här delen av handledningen lägger till den sista delen i appen, navigering mellan sidan alla anteckningar och den enskilda anteckningen.
Innan du skriver någon kod för att hantera navigering i appen ska vi beskriva det förväntade navigeringsbeteendet.
I AllNotesPagefinns samlingen med befintliga anteckningar och knappen Ny anteckning .
- Om du klickar på en befintlig anteckning ska du navigera till anteckningssidan och öppna anteckningen som du klickade på.
- Om du klickar på knappen Ny anteckning ska du gå till anteckningssidan och läsa in en tom anteckning som inte har sparats.
På anteckningssidan lägger du till en bakåtknapp och det finns knapparna Spara och Ta bort .
- Om du klickar på bakåtknappen ska du gå tillbaka till sidan alla anteckningar och ignorera eventuella ändringar som gjorts i anteckningen.
- Om du klickar på knappen Ta bort ska du ta bort anteckningen och sedan gå tillbaka.
Ny anteckning
Först ska du hantera navigeringen för en ny anteckning.
Tips/Råd
Du kan ladda ner eller visa koden för den här handledningen från GitHub-repo. Om du vill se koden som den är i det här steget, se denna commit: navigation – ny anteckning.
I AllNotesPage.xaml letar du reda på
AppBarButtonför en ny anteckning.Lägg till en
Clickhändelsehanterare och byt namn på den tillNewNoteButton_Click. (Se Lägg till händelsehanterare i steget på anteckningssidan om du behöver en påminnelse om hur du gör detta.)<AppBarButton Icon="Add" Label="New note" Click="NewNoteButton_Click"/>NewNoteButton_ClickI metoden (i AllNotesPage.xaml.cs) lägg till den här koden:private void NewNoteButton_Click(object sender, RoutedEventArgs e) { // ↓ Add this. ↓ Frame.Navigate(typeof(NotePage)); }
Varje sida har en ramegenskap som ger en referens till den Frame-instans som Page tillhör (om någon). Det är det Frame som du anropar Navigate-metoden på här. Metoden Navigate tar den typ av sida som du vill navigera till. Du får det Type i C# med hjälp av operatorn typeof .
Om du kör appen nu kan du klicka på knappen Ny anteckning för att navigera till anteckningssidan och skriva in i anteckningsredigeraren. Men om du försöker spara anteckningen händer ingenting. Det beror på att en instans av Note modellen inte har skapats på anteckningssidan ännu. Det gör du nu.
Öppna NotePage.xaml.cs.
Lägg till kod för att åsidosätta sidans OnNavigatedTo-metod .
public NotePage() { this.InitializeComponent(); } // ↓ Add this. ↓ protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); noteModel = new Note(); }
När du nu navigerar till NotePageskapas en ny instans av Note modellen.
Befintliga anteckningar
Nu ska du lägga till navigering för befintliga anteckningar. För närvarande, när du klickar på anteckningen i ItemsView, markeras anteckningen, men ingenting händer. Standardbeteendet för de flesta samlingskontroller är en enskild markering, vilket innebär att ett objekt väljs i taget. Du uppdaterar ItemsView så att du i stället för att välja det kan klicka på ett objekt som en knapp.
Tips/Råd
Du kan ladda ner eller visa koden för den här handledningen från GitHub-repo. Om du vill se koden som den är i det här steget kan du läsa denna commit: navigation – slutgiltig app.
Öppna AllNotesPage.xaml.
Uppdatera XAML för
ItemsViewmed SelectionMode = None och IsItemInvokedEnabled =True.Lägg till en hanterare för händelsen ItemInvoked .
<ItemsView ItemsSource="{x:Bind notesModel.Notes}" Grid.Row="1" Margin="24" ItemTemplate="{StaticResource NoteItemTemplate}" <!-- ↓ Add this. ↓ --> SelectionMode="None" IsItemInvokedEnabled="True" ItemInvoked="ItemsView_ItemInvoked">Leta upp metoden i AllNotesPage.xaml.cs. (Om Visual Studio inte skapade den åt dig, vilket kan inträffa om du kopierar och klistrar in koden, lägger du till den i nästa steg.)
ItemsView_ItemInvokedI -metoden lägger du till kod för att navigera tillNotePage. Den här gången använder du en överlagrad version av Navigate-metoden som låter dig skicka ett objekt till den andra sidan. Skicka den anropadeNotesom den andra navigeringsparametern.private void ItemsView_ItemInvoked(ItemsView sender, ItemsViewItemInvokedEventArgs args) { Frame.Navigate(typeof(NotePage), args.InvokedItem); }Öppna NotePage.xaml.cs.
Uppdatera metodöverskrivningen för att hantera
OnNavigatedTosom skickas med anropet tillNote.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. ↑ }I den här koden kontrollerar du först om den skickade parametern är ett
Noteobjekt. I så fall tilldelar du den somNotemodell för sidan. Om det ärnulleller inte enNoteskapar du en nyNotesom tidigare.
Bakåtnavigering
Slutligen måste du uppdatera appen så att du kan gå tillbaka från en enskild anteckning till sidan alla anteckningar.
Kontrollen WinUI 3 TitleBar innehåller en bakåtknapp som uppfyller alla Fluent Design-riktlinjer för placering och utseende. Du använder den här inbyggda knappen för bakåtnavigering.
Öppna MainWindow.xaml.
Uppdatera XAML för
TitleBarmed IsBackButtonVisible =Trueoch IsBackButtonEnabled som är bundna till egenskapen Frame.CanGoBack .Lägg till en hanterare för backrequested-händelsen . Din XAML bör se ut så här:
<TitleBar x:Name="AppTitleBar" Title="WinUI Notes" IsBackButtonVisible="True" IsBackButtonEnabled="{x:Bind rootFrame.CanGoBack, Mode=OneWay}" BackRequested="AppTitleBar_BackRequested">Här är egenskapen IsBackButtonVisible inställd på
true. Detta gör att bakåtknappen visas i det övre vänstra hörnet i appfönstret.Sedan är egenskapen IsBackButtonEnabled bunden till egenskapen Frame.CanGoBack , så bakåtknappen aktiveras endast om ramen kan navigera tillbaka.
Slutligen läggs händelsehanteraren BackRequested till. Det är här du placerar koden för att navigera tillbaka.
I MainWindow.xaml.cs lägger du till den här koden i
AppTitleBar_BackRequestedmetoden:private void AppTitleBar_BackRequested(TitleBar sender, object args) { // ↓ Add this. ↓ if (rootFrame.CanGoBack == true) { rootFrame.GoBack(); } // ↑ Add this. ↑ }Klassen
Framehåller reda på navigeringen i sin BackStack så att du kan gå tillbaka till föregående sidor genom att anropa GoBack-metoden . Det är en bra idé att alltid kontrollera egenskapen CanGoBack innan du anroparGoBack.
Därefter måste du uppdatera koden i NotePage för att gå tillbaka när anteckningen har tagits bort.
Öppna NotePage.xaml.cs.
DeleteButton_ClickUppdatera händelsehanterarmetoden med ett anrop tillFrame.CanGoBackmetoden när anteckningen har tagits bort: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. ↑ }
Tips/Råd
Du kanske har märkt att i NotePage anropar du Frame.GoBack, medan i MainWindow anropade du rootFrame.GoBack. Det beror på att Page-klassen har en Frame-egenskap som hämtar den Frame som är värd för Page, om någon. I det här fallet får den en referens till rootFrame.
Nu kan du köra din app. Prova att lägga till nya anteckningar, navigera fram och tillbaka mellan anteckningar och ta bort anteckningar.
Läs mer i dokumenten:
- Implementera navigering mellan två sidor
- Navigeringshistorik och bakåtriktad navigering
- Ramklass, Sidklass
Nästa steg
Grattis! Du har slutfört självstudien Skapa en WinUI-app !
Följande länkar innehåller mer information om hur du skapar appar med WinUI och Windows App SDK:
Windows developer