Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Most, hogy a Note rendelkezik egy State-val, frissítse a navigációt úgy, hogy visszaadja azt a AllNotesPage számára, ahol a State alapján megfelelően kezelheti. Ez lehetővé teszi a navigációval kapcsolatos felhasználói élmény javítását is.
Tip
Szükség esetén tekintse át az első WinUI 3-alkalmazás létrehozását, 1. lépés – Navigáció. A módosítások végrehajtása előtt hasznos megérteni, hogyan van beállítva a navigáció.
Jelenleg minden visszanavigálás NotePage helyről vissza AllNotesPage helyre a Frame.GoBack egyszerű hívásával történik. A metódus azonban GoBack nem teszi lehetővé egy navigációs paraméter átadását. Ahhoz, hogy a Note elemet paraméterként átadhassa, a visszanavigálást előrenavigálásra kell cserélnie (Frame.Navigate).
GoBack emellett nem ad hozzá bejegyzést a navigációs veremhez, ahogyan a továbbítási navigáció teszi, ezért a backstack kezelését kell elvégeznie, hogy megakadályozza a továbbítási navigáció hozzáadását.
Tip
Az oktatóanyag befejezett kódját a WinUI Notes 2. részében található GitHub adattárból töltheti le vagy tekintheti meg. A projekt kezdeti és végső állapota közötti különbségek megtekintéséhez lásd ezt a commitot: frissítések a 2. részhez.
OnNavigatingFrom
A(z) NotePage.cs elemben írja felül az OnNavigatingFrom metódust. Ez akkor hívódik meg, amikor a felhasználó megnyomja a Vissza gombot, és meghívódik a GoBack. Segítségével elfoghatja a navigációt, ellenőrizheti a megjegyzést State, és szükség esetén megszakíthatja a navigációt.
Ha a jegyzet nincs mentve, megszakítja a háttérnavigációt, és megjelenik egy párbeszédpanel, amely megkérdezi, hogy a felhasználó menteni szeretné-e a jegyzetet.
- Ha a felhasználó menti a jegyzetet, hívja meg a
SaveAsync-t, majd cserélje le a visszanavigációt egyNavigatehívással, amely átadja a jegyzetet aAllNotesPageszámára. - Ha a felhasználó nem menti a módosításokat, a TextBox.Undo használatával visszavonhatja a módosításokat, alaphelyzetbe állíthatja a jegyzet állapotát, és újraindíthatja a háttérnavigációt.
// ↓ 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
Ezután módosítsa a törlés gombesemény Click kódját a következőben NotePage.xaml.cs: . Ahelyett, hogy egyszerűen törölné a jegyzetet, majd visszalépne, ellenőrizni fogja a jegyzet állapotát.
- Ha az állapot –
Unsetami azt jelenti, hogy a jegyzet újonnan lett létrehozva, nem rendelkezik módosításokkal, és nem lett mentve – egyszerűen lépjen vissza. Nem kell paraméterként megadnia a megjegyzést. - Ellenkező esetben törölje a jegyzetfájlt a fájlrendszerből, és adja vissza az
Noteobjektumot navigációs paraméterként. EzutánAllNotesPagemegkapja a(z)Noteelemet a(z)Deletedállapotával, és tudni fogja, hogy törölnie kell a(z)Notesgyűjteményből.
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);
}
}
}
Mentés és bezárás
A felhasználónak jelenleg a jegyzet mentéséhez kell kattintania, majd a vissza nyílra kattintva bezárhatja a jegyzetoldalt, és visszaléphet a jegyzetgyűjteményhez. Ez a felület továbbfejleszthető azáltal, hogy lehetővé teszi a felhasználó számára, hogy egyetlen kattintással mentse és zárja be a jegyzetet. Ehhez a „Mentés” gombot egy „Mentés és bezárás” SplitButton vezérlőre cseréli, amelynek legördülő menüjében a csak mentés lehetőség is elérhető.
<!-- ↓ 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>
Adjon hozzá egy új eseménykezelőt a "Mentés és bezárás" gombeseményhez Click . Itt mentse a jegyzetet, majd küldje vissza a AllNotesPage számára navigációs paraméterként.
// ↓ Add this. ↓
private async void SaveCloseButton_Click(SplitButton sender, SplitButtonClickEventArgs args)
{
if (noteModel is not null)
{
await noteModel.SaveAsync();
Frame.Navigate(typeof(AllNotesPage), noteModel);
}
}
A navigációs paraméter kezelése az AllNotesPage-ben
A AllNotesPage elemben kezelnie kell a beérkező navigációs paramétert (Note), és szükség szerint hozzá kell adnia a Notes gyűjteményhez, vagy el kell távolítania abból.
A bejövő navigációs paraméter kezeléséhez felül kell bírálnia az OnNavigatedTo metódust az itt látható módon.
// ↓ 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();
}
}
Most már futtathatja az alkalmazást, hogy lássa, hogyan működnek ezek a módosítások. Próbáljon meg új jegyzeteket hozzáadni, navigáljon oda-vissza a jegyzetek között, és törölje a jegyzeteket.
További információ a dokumentumokban:
- Navigáció megvalósítása két oldal között
- Navigációs előzmények és visszafelé navigáció
- Keretosztály, Laposztály
Következő lépések
Gratulálok! Elvégezte a WinUI Notes 2. rész oktatóanyagát!
Az alábbi hivatkozások további információt nyújtanak a WinUI-val és a Windows App SDK-val történő alkalmazások létrehozásáról:
Windows developer