Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Jetzt erstellen Sie eine Seite, die es einem Benutzer ermöglicht, eine Notiz zu bearbeiten, und dann schreiben Sie den Code, um die Notiz zu speichern oder zu löschen.
Tipp
Sie können den Code für dieses Lernprogramm aus dem GitHub-Repository herunterladen oder anzeigen. Um den Code wie in diesem Schritt anzuzeigen, lesen Sie diesen Commit: Notizseite – Initial.
Fügen Sie zunächst die neue Seite zum Projekt hinzu:
Klicken Sie im Projektmappen-Explorer-Bereich von Visual Studio mit der rechten Maustaste auf das WinUINotes-Projekt> "Neues Element>...".
Wählen Sie im Dialogfeld " Neues Element hinzufügen " winUI in der Vorlagenliste auf der linken Seite des Fensters aus. Wählen Sie als Nächstes die Vorlage "Leere Seite (WinUI 3)" aus. Benennen Sie die Datei NotePage.xaml, und wählen Sie dann "Hinzufügen" aus.
Die NotePage.xaml Datei wird auf einer neuen Registerkarte geöffnet, wobei alle XAML-Markups angezeigt werden, die die Benutzeroberfläche der Seite darstellen. Ersetzen Sie das
<Grid> ... </Grid>Element im XAML-Code durch das folgende Markup:<Grid Padding="16" RowSpacing="8"> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="400"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <TextBox x:Name="NoteEditor" AcceptsReturn="True" TextWrapping="Wrap" PlaceholderText="Enter your note" Header="New note" ScrollViewer.VerticalScrollBarVisibility="Auto" Width="400" Grid.Column="1"/> <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Spacing="4" Grid.Row="1" Grid.Column="1"> <Button Content="Save" Style="{StaticResource AccentButtonStyle}"/> <Button Content="Delete"/> </StackPanel> </Grid>Speichern Sie die Datei, indem Sie STRG+S drücken, auf das Symbol "Speichern" in der Symbolleiste klicken oder das Menü "Datei>speichern NotePage.xaml" auswählen.
Wenn Sie die App gerade ausführen, wird die soeben erstellte Notizseite nicht angezeigt. Das liegt daran, dass Sie es trotzdem als Inhalt des
FrameSteuerelements festlegenMainWindowmüssen.Öffnen MainWindow.xaml Und als
NotePageim Folgenden festlegenFrame:<Frame x:Name="rootFrame" Grid.Row="1" SourcePageType="local:NotePage"/>Wenn Sie die App jetzt ausführen,
Framewird eine Instanz geladenNotePageund dem Benutzer angezeigt.
Von Bedeutung
XAML-Namespacezuordnungen (xmlns) sind das XAML-Gegenstück zur C# using -Anweisung.
local: ist ein Präfix, das Für Sie innerhalb der XAML-Seiten für Ihr App-Projekt (xmlns:local="using:WinUINotes") zugeordnet ist. Es wird zugeordnet, um auf denselben Namespace zu verweisen, der erstellt wird, um das Attribut und den x:Class Code für alle XAML-Dateien einschließlich enthalten App.xaml. Solange Sie benutzerdefinierte Klassen definieren, die Sie in XAML in diesem Namespace verwenden möchten, können Sie das local: Präfix verwenden, um auf Ihre benutzerdefinierten Typen in XAML zu verweisen.
Lassen Sie uns die wichtigsten Teile der XAML-Steuerelemente auf der Seite aufgliedern:
Grid.RowDefinitions und Grid.ColumnDefinitions definieren ein Raster mit 2 Zeilen und 3 Spalten (platziert unter der Titelleiste).
- Die untere Zeile wird automatisch (
Auto) so angepasst, dass sie an den Inhalt angepasst wird, die beiden Schaltflächen. In der obersten Zeile werden alle verbleibenden vertikalen Abstände (*) verwendet. - Die mittlere Spalte ist
400epx breit und befindet sich dort, wo sich der Notiz-Editor befindet. Die Spalten auf beiden Seiten sind leer und teilen den verbleibenden horizontalen Abstand zwischen ihnen (*).
Hinweis
Aufgrund der Funktionsweise des Skalierungssystems, wenn Sie Ihre XAML-App entwerfen, entwerfen Sie in effektiven Pixeln und nicht in tatsächlichen physischen Pixeln. Effektive Pixel (Epx) sind eine virtuelle Maßeinheit und werden verwendet, um Layoutabmessungen und Abstände unabhängig von der Bildschirmdichte auszudrücken.
- Die untere Zeile wird automatisch (
<TextBox x:Name="NoteEditor" ... > ... </TextBox>ist ein Texteingabesteuerelement (TextBox), das für die mehrzeilige Texteingabe konfiguriert ist und in der oberen mittleren Zelle derGrid(Grid.Column="1") platziert wird. Zeilen- und Spaltenindizes sind 0-basiert, und standardmäßig werden Steuerelemente in Zeile 0 und Spalte 0 des übergeordneten ElementsGridplatziert. Dies entspricht also der Angabe von Zeile 0, Spalte 1.<StackPanel Orientation="Horizontal" ... > ... </StackPanel>definiert ein Layoutsteuerelement (StackPanel), das seine untergeordneten Elemente vertikal (Standard) oder horizontal stapelt. Sie wird in der unteren Mittleren Zelle derGrid(Grid.Row="1" Grid.Column="1") platziert.Hinweis
Grid.Row="1" Grid.Column="1"ist ein Beispiel für angefügte XAML-Eigenschaften. Mit angefügten Eigenschaften kann ein XAML-Objekt eine Eigenschaft festlegen, die zu einem anderen XAML-Objekt gehört. Wie in diesem Fall können untergeordnete Elemente angefügte Eigenschaften verwenden, um ihr übergeordnetes Element darüber zu informieren, wie sie in der Benutzeroberfläche dargestellt werden sollen.Zwei
<Button>Steuerelemente befinden sich innerhalb der<StackPanel>horizontal angeordneten und angeordneten Steuerelemente. Sie fügen den Code hinzu, um die Click-Ereignisse der Schaltflächen im nächsten Abschnitt zu behandeln.
Weitere Informationen finden Sie in den Dokumenten:
Laden und Speichern einer Notiz
Öffnen Sie die NotePage.xaml.cs CodeBehind-Datei. Wenn Sie eine neue XAML-Datei hinzufügen, enthält der Code-Behind eine einzige Zeile im Konstruktor, einen Aufruf der InitializeComponent-Methode:
namespace WinUINotes
{
public sealed partial class NotePage : Page
{
public NotePage()
{
this.InitializeComponent();
}
}
}
Die InitializeComponent-Methode liest das XAML-Markup und initialisiert alle vom Markup definierten Objekte. Die Objekte sind in ihrer verschachtelten Beziehung miteinander verbunden und die im Code definierten Event-Handler werden an die in der XAML festgelegten Ereignisse angehängt.
Jetzt fügen Sie der NotePage.xaml.cs CodeBehind-Datei Code hinzu, um das Laden und Speichern von Notizen zu verarbeiten.
Fügen Sie der
NotePageKlasse die folgenden Variablendeklarationen hinzu:public sealed partial class NotePage : Page { private StorageFolder storageFolder = ApplicationData.Current.LocalFolder; private StorageFile? noteFile = null; private string fileName = "note.txt";Wenn eine Notiz gespeichert wird, wird sie im lokalen Speicher der App als Textdatei gespeichert.
Sie verwenden die StorageFolder-Klasse , um auf den lokalen Datenordner der App zuzugreifen. Dieser Ordner ist spezifisch für Ihre App, sodass hier gespeicherte Notizen nicht von anderen Apps aufgerufen werden können. Sie verwenden die StorageFile-Klasse , um auf die in diesem Ordner gespeicherte Textdatei zuzugreifen. Der Name der Datei wird durch die
fileName-Variable dargestellt. Legen Sie vorerst auf "fileName" fest.Erstellen Sie einen Ereignishandler für das Loaded-Ereignis der Notizseite.
public NotePage() { this.InitializeComponent(); // ↓ Add this. ↓ Loaded += NotePage_Loaded; } // ↓ Add this event handler method. ↓ private async void NotePage_Loaded(object sender, RoutedEventArgs e) { noteFile = (StorageFile)await storageFolder.TryGetItemAsync(fileName); if (noteFile is not null) { NoteEditor.Text = await FileIO.ReadTextAsync(noteFile); } }In dieser Methode rufen Sie TryGetItemAsync auf, um die Textdatei aus dem Ordner abzurufen. Wenn die Datei nicht vorhanden ist, wird sie zurückgegeben
null. Wenn die Datei vorhanden ist, rufen Sie ReadTextAsync auf, um den Text aus der Datei in dieNoteEditordes Steuerelements zu lesen. (Denken Sie daran, dass das Steuerelement,NoteEditordasTextBoxSie in der XAML-Datei erstellt haben. Sie verweisen hier in Ihrer CodeBehind-Datei mithilfe derx:Namezugewiesenen CodeBehind-Datei darauf.)Von Bedeutung
Sie müssen diese Methode mit dem
asyncSchlüsselwort markieren, da die Dateizugriffsaufrufe asynchron sind. Kurz gesagt, wenn Sie eine Methode aufrufen, die auf...Async(zTryGetItemAsync. B.) endet, können Sie dem Aufruf den Await-Operator hinzufügen. Dadurch wird der nachfolgende Code erst ausgeführt, wenn der erwartete Aufruf abgeschlossen ist und die Benutzeroberfläche reaktionsfähig bleibt. Bei Verwendungawaitmuss die Methode, aus der Sie aufrufen, mit dem asynchronen Schlüsselwort gekennzeichnet werden. Weitere Informationen finden Sie unter Aufrufen asynchroner APIs in C#.
Weitere Informationen finden Sie in den Dokumenten:
Hinzufügen von Ereignishandlern
Fügen Sie als Nächstes die Click-Ereignishandler für die Schaltflächen " Speichern " und "Löschen " hinzu. Das Hinzufügen von Ereignishandlern ist etwas, das Sie beim Erstellen Ihrer Apps häufig ausführen, sodass Visual Studio mehrere Features bereitstellt, um dies zu vereinfachen.
Platzieren Sie den Cursor in der NotePage.xaml Datei nach dem
ContentAttribut im Save-SteuerelementButton. Geben SieClick=ein. Zu diesem Zeitpunkt sollte Visual Studio eine automatisch abgeschlossene Benutzeroberfläche auffüllen, die wie folgt aussieht:
- Drücken Sie die NACH-UNTEN-TASTE, um den neuen Ereignishandler< auszuwählen>, und drücken Sie dann die TAB-TASTE. Visual Studio schließt das Attribut mit
Click="Button_Click"und fügt eine Ereignishandlermethode hinzu, die in derButton_ClickCodeBehind-Datei benannt istNotePage.xaml.cs.
Jetzt sollten Sie die
Button_ClickMethode in etwas aussagekräftiger umbenennen. Dies führen Sie in den folgenden Schritten aus.- Drücken Sie die NACH-UNTEN-TASTE, um den neuen Ereignishandler< auszuwählen>, und drücken Sie dann die TAB-TASTE. Visual Studio schließt das Attribut mit
Suchen Sie in NotePage.xaml.cs, die Methode, die für Sie hinzugefügt wurde:
private void Button_Click(object sender, RoutedEventArgs e) { }Tipp
Um Code in Ihrer App zu finden, klicken Sie in der Titelleiste von Visual Studio auf "Suchen ", und verwenden Sie die Option "Codesuche ". Doppelklicken Sie auf das Suchergebnis, um den Code im Code-Editor zu öffnen.
Platzieren Sie den Cursor vor dem "B",
Buttonund geben Sie einSave. Warten Sie einen Moment, und der Methodenname wird grün hervorgehoben.Wenn Sie mit dem Mauszeiger auf den Methodennamen zeigen, zeigt Visual Studio eine QuickInfo mit einem Schraubenzieher oder Glühbirnensymbol an. Klicken Sie auf die Nach-unten-Taste neben dem Symbol, und klicken Sie dann auf "Button_Click" in "SaveButton_Click".
Visual Studio benennt die Methode überall in Ihrer App um, einschließlich in der XAML-Datei, in der Sie sie zuerst hinzugefügt
Buttonhaben.Wiederholen Sie diese Schritte für die Schaltfläche "Löschen ", und benennen Sie die Methode
DeleteButton_Clickin " um.
Nachdem die Ereignishandler verknüpft wurden, können Sie den Code hinzufügen, um die Notizdatei zu speichern und zu löschen.
Fügen Sie diesen Code in der
SaveButton_ClickMethode hinzu, um die Datei zu speichern. Beachten Sie, dass Sie auch die Methodensignatur mit demasyncSchlüsselwort aktualisieren müssen.private async void SaveButton_Click(object sender, RoutedEventArgs e) { if (noteFile is null) { noteFile = await storageFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); } await FileIO.WriteTextAsync(noteFile, NoteEditor.Text); }In der
SaveButton_ClickMethode überprüfen Sie zunächst, obnoteFileerstellt wurde. Wenn dies der Name istnull, müssen Sie eine neue Datei im lokalen Speicherordner mit dem Namen erstellen, der durch diefileNameVariable dargestellt wird, und die Datei dernoteFileVariablen zuweisen. Anschließend schreiben Sie den Text im Steuerelement inTextBoxdie datei, dargestellt durchnoteFile.Fügen Sie diesen Code in der
DeleteButton_ClickMethode hinzu, um die Datei zu löschen. Sie müssen die Methodensignatur auch hier mit demasyncSchlüsselwort aktualisieren.private async void DeleteButton_Click(object sender, RoutedEventArgs e) { if (noteFile is not null) { await noteFile.DeleteAsync(); noteFile = null; NoteEditor.Text = string.Empty; } }In der
DeleteButton_ClickMethode überprüfen Sie zunächst, obnoteFilevorhanden ist. Wenn dies der Fall ist, löschen Sie die Datei, die durch den lokalen Speicherordner dargestellt wirdnoteFile, und legen Sie sienoteFileaufnull. Setzen Sie dann den Text imTextBoxSteuerelement auf eine leere Zeichenfolge zurück.Von Bedeutung
Nachdem die Textdatei aus dem Dateisystem gelöscht wurde, ist es wichtig, auf .
noteFilenullDenken Sie daran, dass es sich um einenoteFilehandelt, die Zugriff auf die Systemdatei in Ihrer App ermöglicht. Nachdem die Systemdatei gelöscht wurde, verweist sie immer noch auf die Stelle,noteFilean der sich die Systemdatei befand, weiß aber nicht, dass sie nicht mehr vorhanden ist. Wenn Sie versuchen, die Systemdatei jetzt zu lesen, zu schreiben oder zu löschen, wird eine Fehlermeldung angezeigt.Speichern Sie die Datei, indem Sie STRG+S drücken, auf das Symbol "Speichern" in der Symbolleiste klicken oder das Menü "Datei>speichern NotePage.xaml.cs" auswählen.
Der endgültige Code für die CodeBehind-Datei sollte wie folgt aussehen:
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using System;
using Windows.Storage;
namespace WinUINotes
{
public sealed partial class NotePage : Page
{
private StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
private StorageFile? noteFile = null;
private string fileName = "note.txt";
public NotePage()
{
this.InitializeComponent();
Loaded += NotePage_Loaded;
}
private async void NotePage_Loaded(object sender, RoutedEventArgs e)
{
noteFile = (StorageFile)await storageFolder.TryGetItemAsync(fileName);
if (noteFile is not null)
{
NoteEditor.Text = await FileIO.ReadTextAsync(noteFile);
}
}
private async void SaveButton_Click(object sender, RoutedEventArgs e)
{
if (noteFile is null)
{
noteFile = await storageFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
}
await FileIO.WriteTextAsync(noteFile, NoteEditor.Text);
}
private async void DeleteButton_Click(object sender, RoutedEventArgs e)
{
if (noteFile is not null)
{
await noteFile.DeleteAsync();
noteFile = null;
NoteEditor.Text = string.Empty;
}
}
}
}
Testen der Notiz
Mit diesem Code können Sie die App testen, um sicherzustellen, dass die Notiz ordnungsgemäß gespeichert und geladen wird.
- Erstellen Sie das Projekt, und führen Sie es aus, indem Sie F5 drücken, in der Symbolleiste auf die Schaltfläche "Start debuggen" klicken oder das Menü "Debuggen starten> auswählen.
- Geben Sie in das Textfeld ein, und drücken Sie die Schaltfläche "Speichern".
- Schließen Sie die App, und starten Sie sie dann neu. Die eingegebene Notiz sollte aus dem Speicher des Geräts geladen werden.
- Drücken Sie die Entf-Taste .
- Schließen Sie die App, starten Sie sie neu. Sie sollten eine neue leere Notiz erhalten.
Von Bedeutung
Nachdem Sie bestätigt haben, dass das Speichern und Löschen einer Notiz ordnungsgemäß funktioniert, erstellen und speichern Sie erneut eine neue Notiz. Sie möchten eine gespeicherte Notiz haben, um die App in späteren Schritten zu testen.
Windows developer