Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Vous allez maintenant créer une page qui permet à un utilisateur de modifier une note, puis vous allez écrire le code pour enregistrer ou supprimer la note.
Conseil / Astuce
Vous pouvez télécharger ou afficher le code de ce didacticiel à partir du dépôt GitHub. Pour voir le code tel qu’il se trouve dans cette étape, consultez cette page de validation : page remarque - initiale.
Ajoutez d’abord la nouvelle page au projet :
Dans le volet Explorateur de solutions de Visual Studio, cliquez avec le bouton droit sur le projet >Ajouter>un nouvel élément....
Dans la boîte de dialogue Ajouter un nouvel élément , sélectionnez WinUI dans la liste des modèles sur le côté gauche de la fenêtre. Ensuite, sélectionnez le modèle Page vide (WinUI 3). Nommez le fichier NotePage.xaml, puis sélectionnez Ajouter.
Le NotePage.xaml fichier s’ouvre dans un nouvel onglet, affichant tout le balisage XAML qui représente l’interface utilisateur de la page. Remplacez l’élément
<Grid> ... </Grid>dans le code XAML par le balisage suivant :<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>Enregistrez le fichier en appuyant sur Ctrl + S, en cliquant sur l’icône Enregistrer dans la barre d’outils ou en sélectionnant le menule >NotePage.xaml .
Si vous exécutez l’application en ce moment, vous ne verrez pas la page de note que vous venez de créer. C’est parce que vous devez toujours le définir comme contenu du
Framecontrôle dansMainWindow.Ouvrez et définissez MainWindow.xaml
NotePageen tant que SourcePageType sur leFrame, comme suit :<Frame x:Name="rootFrame" Grid.Row="1" SourcePageType="local:NotePage"/>À présent, lorsque vous exécutez l’application, elle
Framecharge une instance etNotePagel’affiche à l’utilisateur.
Important
Les mappages d’espace de noms XAML (xmlns) sont l’équivalent XAML de l’instruction C#using.
local: est un préfixe mappé pour vous dans les pages XAML de votre projet d’application (xmlns:local="using:WinUINotes"). Il est mappé pour faire référence à l’espace de noms créé pour contenir l’attribut et le x:Class code de tous les fichiers XAML, y compris App.xaml. Tant que vous définissez les classes personnalisées que vous souhaitez utiliser en XAML dans ce même espace de noms, vous pouvez utiliser le local: préfixe pour faire référence à vos types personnalisés en XAML.
Nous allons décomposer les composantes clés des contrôles XAML placés sur la page :
Grid.RowDefinitions et Grid.ColumnDefinitions définissent une grille avec 2 lignes et 3 colonnes (placées sous la barre de titre).
- La ligne inférieure est automatiquement (
Auto) dimensionnée pour s’adapter à son contenu, les deux boutons. La ligne supérieure utilise l’espace vertical restant (*). - La colonne centrale est
400large epx et correspond à l’emplacement où se trouve l’éditeur de notes. Les colonnes de chaque côté sont vides et fractionnées tout l’espace horizontal restant entre eux (*).
Note
En raison du fonctionnement du système de mise à l’échelle, lorsque vous concevez votre application XAML, vous concevez en pixels effectifs, et non en pixels physiques réels. Les pixels effectifs (epx) sont une unité virtuelle de mesure et sont utilisés pour exprimer les dimensions de disposition et l’espacement, indépendamment de la densité de l’écran.
- La ligne inférieure est automatiquement (
<TextBox x:Name="NoteEditor" ... > ... </TextBox>est un contrôle d’entrée de texte (TextBox) configuré pour l’entrée de texte à plusieurs lignes et est placé dans la cellule centrale supérieure duGrid(Grid.Column="1"). Les index de ligne et de colonne sont basés sur 0 et, par défaut, les contrôles sont placés dans la ligne 0 et la colonne 0 du parentGrid. Il s’agit donc de l’équivalent de la spécification de la ligne 0, colonne 1.<StackPanel Orientation="Horizontal" ... > ... </StackPanel>définit un contrôle de disposition (StackPanel) qui empile ses enfants verticalement (par défaut) ou horizontalement. Elle est placée dans la cellule centrale inférieure duGrid(Grid.Row="1" Grid.Column="1").Note
Grid.Row="1" Grid.Column="1"est un exemple de propriétés jointes XAML. Les propriétés jointes permettent à un objet XAML de définir une propriété qui appartient à un autre objet XAML. Souvent, comme dans ce cas, les éléments enfants peuvent utiliser des propriétés jointes pour informer leur élément parent de la façon dont ils doivent être présentés dans l’interface utilisateur.Deux
<Button>contrôles se trouvent à l’intérieur et<StackPanel>disposés horizontalement. Vous allez ajouter le code pour gérer les événements Click des boutons dans la section suivante.
En savoir plus dans la documentation :
- Mises en page adaptatives avec XAML
- Panneaux de disposition
- espaces de noms XAML et mappage d’espaces de noms
Charger et enregistrer une note
Ouvrez le NotePage.xaml.cs fichier code-behind. Quand vous ajoutez un nouveau fichier XAML, le code-behind contient une seule ligne dans le constructeur, un appel à la méthode InitializeComponent :
namespace WinUINotes
{
public sealed partial class NotePage : Page
{
public NotePage()
{
this.InitializeComponent();
}
}
}
La méthode InitializeComponent lit le balisage XAML et initialise tous les objets définis par le balisage. Les objets sont connectés dans leurs relations parent-enfant et les gestionnaires d’événements définis dans le code sont attachés aux événements définis dans le XAML.
Vous allez maintenant ajouter du code au fichier code-behind pour gérer le NotePage.xaml.cs chargement et l’enregistrement des notes.
Ajoutez les déclarations de variables suivantes à la
NotePageclasse :public sealed partial class NotePage : Page { private StorageFolder storageFolder = ApplicationData.Current.LocalFolder; private StorageFile? noteFile = null; private string fileName = "note.txt";Lorsqu’une note est enregistrée, elle est enregistrée dans le stockage local de l’application en tant que fichier texte.
Vous utilisez la classe StorageFolder pour accéder au dossier de données locales de l’application. Ce dossier est spécifique à votre application. Les notes enregistrées ici ne sont donc pas accessibles par d’autres applications. Vous utilisez la classe StorageFile pour accéder au fichier texte enregistré dans ce dossier. Le nom du fichier est représenté par la variable
fileName. Pour l’instant, définissezfileNamesur «note.txt».Créez un gestionnaire d’événements pour l’événement Loaded de la page de notes.
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); } }Dans cette méthode, vous appelez TryGetItemAsync pour récupérer le fichier texte du dossier. Si le fichier n’existe pas, il retourne
null. Si le fichier existe, appelez ReadTextAsync pour lire le texte du fichier dans laNoteEditorpropriété Text du contrôle. (N’oubliez pas queNoteEditorleTextBoxcontrôle que vous avez créé dans le fichier XAML. Vous le référencez ici dans votre fichier code-behind à l’aide de celui-cix:Name.)Important
Vous devez marquer cette méthode avec le
asyncmot clé, car les appels d’accès aux fichiers sont asynchrones. En bref, si vous appelez une méthode qui se termine...Asyncpar (commeTryGetItemAsync), vous pouvez ajouter l’opérateur await à l’appel. Cela empêche l’exécution du code suivant jusqu’à ce que l’appel attendu se termine et conserve la réactivité de votre interface utilisateur. Lorsque vous utilisezawait, la méthode à partir de laquelle vous appelez doit être marquée avec le mot clé asynchrone . Pour plus d’informations, consultez Appeler des API asynchrones en C#.
En savoir plus dans la documentation :
Ajouter des gestionnaires d’événements
Ensuite, ajoutez les gestionnaires d’événements Click pour les boutons Enregistrer et Supprimer . L’ajout de gestionnaires d’événements est quelque chose que vous effectuerez souvent lors de la création de vos applications. Visual Studio fournit donc plusieurs fonctionnalités pour faciliter la création de vos applications.
Dans le NotePage.xaml fichier, placez votre curseur après l’attribut
Contentdans le contrôle EnregistrerButton. TapezClick=. À ce stade, Visual Studio doit afficher une interface utilisateur de saisie semi-automatique qui ressemble à ceci :
- Appuyez sur la flèche vers le bas pour sélectionner <Nouveau gestionnaire> d’événements, puis appuyez sur Tab. Visual Studio termine l’attribut avec
Click="Button_Click"et ajoute une méthode de gestionnaire d’événements nomméeButton_Clickdans le NotePage.xaml.cs fichier code-behind.
À présent, vous devez renommer la
Button_Clickméthode en quelque chose de plus significatif. Pour ce faire, procédez comme suit.- Appuyez sur la flèche vers le bas pour sélectionner <Nouveau gestionnaire> d’événements, puis appuyez sur Tab. Visual Studio termine l’attribut avec
Dans NotePage.xaml.cs, recherchez la méthode qui a été ajoutée pour vous :
private void Button_Click(object sender, RoutedEventArgs e) { }Conseil / Astuce
Pour localiser du code dans votre application, cliquez sur Rechercher dans la barre de titre de Visual Studio et utilisez l’option Recherche de code. Double-cliquez sur le résultat de recherche pour ouvrir le code dans l’éditeur de code.
Placez votre curseur avant le « B » dans
Buttonet tapezSave. Attendez un instant, et le nom de la méthode sera mis en surbrillance en vert.Lorsque vous pointez sur le nom de la méthode, Visual Studio affiche une info-bulle avec un tournevis ou une icône d’ampoule. Cliquez sur le bouton flèche vers le bas en regard de l’icône, puis cliquez sur Renommer « Button_Click » en « SaveButton_Click ».
Visual Studio renomme la méthode partout dans votre application, notamment dans le fichier XAML où vous l’avez ajoutée pour la
Buttonpremière fois.Répétez ces étapes pour le bouton Supprimer et renommez la méthode en
DeleteButton_Click.
Maintenant que les gestionnaires d’événements sont branchés, vous pouvez ajouter le code pour enregistrer et supprimer le fichier de notes.
Ajoutez ce code dans la
SaveButton_Clickméthode pour enregistrer le fichier. Notez que vous devez également mettre à jour la signature de méthode avec leasyncmot clé.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); }Dans la
SaveButton_Clickméthode, vous vérifiez d’abord sinoteFilevous avez été créé. Si c’estnullle cas, vous devez créer un fichier dans le dossier de stockage local avec le nom représenté par lafileNamevariable et affecter le fichier à lanoteFilevariable. Ensuite, vous écrivez le texte dans leTextBoxcontrôle dans le fichier représenté parnoteFile.Ajoutez ce code dans la
DeleteButton_Clickméthode pour supprimer le fichier. Vous devez également mettre à jour la signature de méthode avec leasyncmot clé ici.private async void DeleteButton_Click(object sender, RoutedEventArgs e) { if (noteFile is not null) { await noteFile.DeleteAsync(); noteFile = null; NoteEditor.Text = string.Empty; } }Dans la méthode, vous vérifiez d’abord
DeleteButton_Clicks’ilnoteFileexiste. Si c’est le cas, supprimez le fichier représenté parnoteFilele dossier de stockage local et définissez surnoteFilenull. Ensuite, réinitialisez le texte dans leTextBoxcontrôle sur une chaîne vide.Important
Une fois le fichier texte supprimé du système de fichiers, il est important de définir
noteFilenullla valeur . N’oubliez pas qu’ilnoteFiles’agit d’un StorageFile qui fournit l’accès au fichier système dans votre application. Une fois le fichier système supprimé,noteFilepointe toujours vers l’emplacement du fichier système, mais ne sait pas qu’il n’existe plus. Si vous essayez de lire, d’écrire ou de supprimer le fichier système maintenant, vous obtenez une erreur.Enregistrez le fichier en appuyant sur Ctrl + S, en cliquant sur l’icône Enregistrer dans la barre d’outils ou en sélectionnant le menule >NotePage.xaml.cs .
Le code final du fichier code-behind doit ressembler à ceci :
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;
}
}
}
}
Tester la note
Avec ce code en place, vous pouvez tester l’application pour vous assurer que la note enregistre et se charge correctement.
- Générez et exécutezle projet en appuyant sur F5, en cliquant sur le bouton Déboguer « Démarrer » dans la barre d’outils ou en sélectionnant le menu Démarrer >le débogage.
- Tapez dans la zone d’entrée de texte et appuyez sur le bouton Enregistrer .
- Fermez l’application, puis redémarrez-la. La note que vous avez entrée doit être chargée depuis le stockage de l’appareil.
- Appuyez sur le bouton Supprimer .
- Fermez l’application, redémarrez-la. Vous devez être présenté avec une nouvelle note vide.
Important
Une fois que vous avez confirmé que l’enregistrement et la suppression d’une note fonctionnent correctement, créez et enregistrez une nouvelle note. Vous souhaiterez avoir une note enregistrée pour tester l’application dans les étapes ultérieures.
Windows developer