Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questa parte dell'esercitazione aggiunge l'ultimo componente all'app, permettendo la navigazione tra la pagina di tutte le note e la pagina della singola nota.
Prima di scrivere codice per gestire la navigazione in-app, descriviamo il comportamento di navigazione atteso.
In AllNotesPageè presente la raccolta di note esistenti e un pulsante Nuova nota .
- Facendo clic su una nota esistente, passare alla pagina della nota e caricare la nota selezionata.
- Fare clic sul pulsante Nuova nota per passare alla pagina della nota e caricare una nota vuota e non salvata.
Nella pagina della nota si aggiungerà un pulsante Indietro e sono disponibili i pulsanti Salva ed Elimina .
- Facendo clic sul pulsante Indietro, tornare alla pagina di tutte le note, annullando le modifiche apportate alla nota.
- Fare clic sul pulsante Elimina per eliminare la nota e quindi tornare indietro.
Nuova nota
In primo luogo, si gestirà lo spostamento per una nuova nota.
Suggerimento
È possibile scaricare o visualizzare il codice per questa esercitazione dal repository GitHub. Per visualizzare il codice così com'è in questo passaggio, vedere questo commit: navigazione - nuova nota.
In AllNotesPage.xaml, trova il
AppBarButtonper una nuova nota.Aggiungere un
Clickgestore eventi e rinominarlo inNewNoteButton_Click. Se è necessario un promemoria su come eseguire questa operazione, vedere Aggiungere gestori eventi nel passaggio della pagina note.<AppBarButton Icon="Add" Label="New note" Click="NewNoteButton_Click"/>NewNoteButton_ClickNel metodo (in AllNotesPage.xaml.cs) aggiungere questo codice:private void NewNoteButton_Click(object sender, RoutedEventArgs e) { // ↓ Add this. ↓ Frame.Navigate(typeof(NotePage)); }
Ogni page ha una proprietà Frame che fornisce un riferimento all'istanza frame a cui Page appartiene (se presente). Questo è il Frame su cui chiami il metodo Navigate qui. Il Navigate metodo accetta il tipo della pagina a cui si desidera passare. È possibile ottenerlo Type in C# usando l'operatore typeof .
Se si esegue l'app ora, è possibile fare clic sul pulsante Nuova nota per passare alla pagina della nota ed è possibile digitare nell'editor note. Tuttavia, se si tenta di salvare la nota, non accadrà nulla. Ciò è dovuto al fatto che non è stata ancora creata un'istanza del Note modello nella pagina della nota. Lo farai ora.
Aprire NotePage.xaml.cs.
Aggiungere il codice per eseguire l'override del metodo OnNavigatedTo della pagina.
public NotePage() { this.InitializeComponent(); } // ↓ Add this. ↓ protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); noteModel = new Note(); }
Quando si passa a NotePage, viene creata una nuova istanza del Note modello.
Note esistenti
Ora aggiungerai la navigazione per le note esistenti. Attualmente, quando si fa clic sulla nota in ItemsView, la nota è selezionata, ma non accade nulla. Il comportamento predefinito per la maggior parte dei controlli raccolta è la selezione singola, ovvero un elemento viene selezionato alla volta. Aggiornerai il ItemsView in modo che, anziché selezionarlo, puoi fare clic su un elemento come un pulsante.
Suggerimento
È possibile scaricare o visualizzare il codice per questa esercitazione dal repository GitHub. Per visualizzare il codice così com'è in questo passaggio, vedere questo commit: navigazione - app finale.
Aprire AllNotesPage.xaml.
Aggiornare il codice XAML per
ItemsViewcon SelectionMode = None e IsItemInvokedEnabled =True.Aggiungere un gestore per l'evento ItemInvoked .
<ItemsView ItemsSource="{x:Bind notesModel.Notes}" Grid.Row="1" Margin="24" ItemTemplate="{StaticResource NoteItemTemplate}" <!-- ↓ Add this. ↓ --> SelectionMode="None" IsItemInvokedEnabled="True" ItemInvoked="ItemsView_ItemInvoked">In AllNotesPage.xaml.cs trovare il
ItemsView_ItemInvokedmetodo . Se Visual Studio non lo ha creato automaticamente, che può verificarsi se si copia e incolla il codice, aggiungerlo nel passaggio successivo.Nel metodo
ItemsView_ItemInvoked, aggiungere del codice per navigare aNotePage. Questa volta userai un overload del metodo Navigate che consente di passare un oggetto all'altra pagina. Passare l'elemento invocatoNotecome secondo parametro di navigazione.private void ItemsView_ItemInvoked(ItemsView sender, ItemsViewItemInvokedEventArgs args) { Frame.Navigate(typeof(NotePage), args.InvokedItem); }Aprire NotePage.xaml.cs.
Aggiorna il metodo override di
OnNavigatedToper gestireNoteche è passato dalla chiamata aNavigate.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. ↑ }In questo codice si verifica prima di tutto se il parametro passato è un
Noteoggetto . In caso affermativo, lo si assegna comeNotemodello per la pagina. Se ènullo non è unNote, crea un nuovoNotecome fatto in precedenza.
Spostamento indietro
Infine, è necessario aggiornare l'app in modo da poter tornare da una singola nota alla pagina tutte le note.
Il controllo TitleBar winUI 3 include un pulsante Indietro che soddisfa tutte le linee guida di Fluent Design per il posizionamento e l'aspetto. Questo pulsante predefinito verrà usato per lo spostamento indietro.
Aprire MainWindow.xaml.
Aggiornare il codice XAML per
TitleBarcon IsBackButtonVisible =Truee IsBackButtonEnabled associato alla proprietà Frame.CanGoBack .Aggiungere un gestore per l'evento BackRequested . Il codice XAML dovrebbe essere simile al seguente:
<TitleBar x:Name="AppTitleBar" Title="WinUI Notes" IsBackButtonVisible="True" IsBackButtonEnabled="{x:Bind rootFrame.CanGoBack, Mode=OneWay}" BackRequested="AppTitleBar_BackRequested">In questo caso, la proprietà IsBackButtonVisible è impostata su
true. In questo modo il pulsante Indietro viene visualizzato nell'angolo superiore sinistro della finestra dell'app.Quindi, la proprietà IsBackButtonEnabled è associata alla proprietà Frame.CanGoBack , quindi il pulsante Indietro è abilitato solo se il frame può tornare indietro.
Viene infine aggiunto il gestore eventi BackRequested . Qui si inserisce il codice per navigare indietro.
In MainWindow.xaml.cs aggiungere questo codice al
AppTitleBar_BackRequestedmetodo :private void AppTitleBar_BackRequested(TitleBar sender, object args) { // ↓ Add this. ↓ if (rootFrame.CanGoBack == true) { rootFrame.GoBack(); } // ↑ Add this. ↑ }La
Frameclasse tiene traccia della navigazione nel relativo BackStack, in modo da poter tornare alle pagine precedenti semplicemente chiamando il metodo GoBack . È consigliabile controllare sempre la proprietà CanGoBack prima di chiamareGoBack.
Successivamente, è necessario aggiornare il codice in NotePage per tornare indietro dopo l'eliminazione della nota.
Aprire NotePage.xaml.cs.
Aggiornare il metodo del
DeleteButton_Clickgestore eventi con una chiamata alFrame.CanGoBackmetodo dopo l'eliminazione della nota: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. ↑ }
Suggerimento
Potresti aver notato che in NotePage, chiami Frame.GoBack, mentre in MainWindow chiamavi rootFrame.GoBack. Ciò è dovuto al fatto che la classe Page ha una proprietà Frame che ottiene l'oggetto Frame che ospita , Pagese presente. In questo caso, ottiene un riferimento a rootFrame.
È ora possibile eseguire l'app. Provare ad aggiungere nuove note, spostarsi tra le note e eliminare le note.
Per altre informazioni, vedere la documentazione:
- Implementare lo spostamento tra due pagine
- Cronologia della navigazione e navigazione all'indietro
- Classe Frame, classe Page
Passaggi successivi
Congratulazioni! L'esercitazione Creare un'app WinUI è stata completata.
I collegamenti seguenti forniscono altre informazioni sulla creazione di app con WinUI e Windows App SDK: