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.
Ora che Note ha un State, aggiorna la navigazione per passarlo di nuovo a AllNotesPage, dove puoi gestirlo in modo appropriato in base al suo State. In questo modo è anche possibile migliorare l'esperienza utente correlata alla navigazione.
Suggerimento
Se necessario, vedere Creare la prima app WinUI 3, Passaggio 1 - Navigazione. È utile capire come è configurata la navigazione prima di apportare queste modifiche.
Attualmente, tutti gli spostamenti da NotePage indietro a AllNotesPage vengono eseguiti con una semplice chiamata a Frame.GoBack. Tuttavia, il GoBack metodo non consente di passare un parametro di navigazione. Per passare un oggetto Note come parametro, è necessario sostituire lo spostamento indietro con uno spostamento avanti (Frame.Navigate).
GoBack inoltre non aggiunge un elemento allo stack di navigazione come avviene con una navigazione in avanti, quindi è necessario gestire lo stack di navigazione all’indietro per evitare che questa navigazione in avanti venga aggiunta.
Suggerimento
È possibile scaricare o visualizzare il codice completato di questa esercitazione dal repo GitHub WinUI Notes part 2. Per visualizzare le differenze tra i punti di inizio e di fine per il progetto, vedere questo commit: aggiornamenti per la parte 2.
OnNavigatingFrom
In NotePage.cs, eseguire l'override del metodo OnNavigatingFrom. Questo viene chiamato dopo che l'utente preme il pulsante Indietro e GoBack viene chiamato. Consente di intercettare la navigazione, verificare la nota State e annullare la navigazione, se necessario.
In questo caso, se la nota non viene salvata, si annulla lo spostamento indietro e viene visualizzata una finestra di dialogo che chiede se l'utente vuole salvare la nota.
- Se l'utente salva la nota, chiamare
SaveAsync, quindi sostituire lo spostamento indietro con una chiamata aNavigateche passa la nota aAllNotesPage. - Se l'utente non salva le modifiche, usa TextBox.Undo per annullare eventuali modifiche, reimpostare lo stato della nota e riavviare lo spostamento indietro.
// ↓ Add this. ↓
protected async override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
if (noteModel?.State == NoteState.Unsaved)
{
e.Cancel = true;
ContentDialog dialog = new ContentDialog();
// XamlRoot must be set for the ContentDialog.
dialog.XamlRoot = this.XamlRoot;
dialog.Title = "Save your work?";
dialog.PrimaryButtonText = "Save";
dialog.SecondaryButtonText = "Don't Save";
dialog.CloseButtonText = "Cancel";
dialog.DefaultButton = ContentDialogButton.Primary;
ContentDialogResult result = await dialog.ShowAsync();
if (result == ContentDialogResult.Primary)
{
await noteModel.SaveAsync();
Frame.Navigate(typeof(AllNotesPage), noteModel);
}
else if (result == ContentDialogResult.Secondary)
{
while (NoteEditor.CanUndo)
{
NoteEditor.Undo();
}
NoteEditor.Focus(FocusState.Programmatic);
noteModel.State = NoteState.Saved;
Frame.Navigate(typeof(AllNotesPage), noteModel);
}
}
}
Delete
Modifica quindi il codice per l'evento del pulsante di eliminazione Click in NotePage.xaml.cs. Invece di eliminare semplicemente la nota e tornare indietro, si verificherà lo stato della nota.
- Se lo stato è
Unset, ovvero la nota è appena creata, non ha modifiche e non è stato salvato, è sufficiente tornare indietro. Non è necessario passare la nota come parametro. - In caso contrario, eliminare il file di note dal file system e passare nuovamente l'oggetto
Notecome parametro di spostamento. QuindiAllNotesPagericeverà ilNotecon il suo statoDeletede saprà di doverlo eliminare dalla raccoltaNotes.
private async void DeleteButton_Click(object sender, RoutedEventArgs e)
{
if (noteModel is not null)
{
if (noteModel.State == NoteState.Unset)
{
// If the note is new, doesn't have any edits,
// and hasn't been saved, just call GoBack.
// There's no need to pass back the noteModel.
if (Frame.CanGoBack == true)
{
Frame.GoBack();
}
}
else
{
// If the note has been saved before, then delete it
// and navigate back to the AllNotesPage passing the
// noteModel with its Deleted state.
await noteModel.DeleteAsync();
Frame.Navigate(typeof(AllNotesPage), noteModel);
}
}
}
Salva e chiudi
Attualmente, l'utente deve fare clic per salvare una nota, quindi fare clic sulla freccia indietro per chiudere la pagina della nota e tornare alla raccolta note. Questa esperienza può essere migliorata consentendo all'utente di salvare e chiudere la nota con un solo clic. Per farlo, sostituirai il pulsante "Salva" con un pulsante SplitButton "Salva e chiudi" con un'opzione nel menu a discesa per salvare soltanto.
<!-- ↓ Delete this. ↓ -->
<!--<Button Content="Save" Click="SaveButton_Click"/>-->
<!-- ↓ Add this. ↓ -->
<SplitButton Content="Save & close" Click="SaveCloseButton_Click"
Height="32">
<SplitButton.Flyout>
<MenuFlyout>
<MenuFlyoutItem Text="Save" Click="SaveButton_Click"/>
</MenuFlyout>
</SplitButton.Flyout>
</SplitButton>
Aggiungere un nuovo gestore dell'evento per l'evento del pulsante "Salva e chiudi" Click. In questo caso, salvare la nota e quindi passarla di nuovo a AllNotesPage come parametro di navigazione.
// ↓ Add this. ↓
private async void SaveCloseButton_Click(SplitButton sender, SplitButtonClickEventArgs args)
{
if (noteModel is not null)
{
await noteModel.SaveAsync();
Frame.Navigate(typeof(AllNotesPage), noteModel);
}
}
Gestire il parametro di spostamento in AllNotesPage
In AllNotesPageè necessario gestire il parametro di navigazione in ingresso (Note) e aggiungerlo o rimuoverlo dalla Notes raccolta in base alle esigenze.
Per gestire il parametro di spostamento in ingresso, eseguire l'override del metodo OnNavigatedTo , come illustrato di seguito.
// ↓ Add this. ↓
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (e.Parameter is Note note)
{
if (note.State == NoteState.Deleted)
{
notesModel.RemoveNote(note);
}
else if (!notesModel.Notes.Contains(note))
{
notesModel.AddNote(note);
}
// This navigation should be treated like a
// back navigation, so clear the backstack.
Frame.BackStack.Clear();
}
}
È ora possibile eseguire l'app per verificare il funzionamento di queste modifiche. 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! Hai completato il tutorial WinUI Notes - parte 2!
I collegamenti seguenti forniscono altre informazioni sulla creazione di app con WinUI e sull'SDK per app di Windows: