Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Теперь вы создадите страницу, которая позволяет пользователю изменять заметку, а затем вы напишете код для сохранения или удаления заметки.
Подсказка
Вы можете скачать или просмотреть код для этого руководства из репозитория GitHub. Чтобы увидеть код, как на этом шаге, см. этот коммит: страница заметок — начальная.
Сначала добавьте новую страницу в проект:
В области обозревателя решений Visual Studio щелкните правой кнопкой мыши на проекте WinUINotes и выберите Добавить>Новый элемент....
В диалоговом окне "Добавление нового элемента" выберите WinUI в списке шаблонов в левой части окна. Затем выберите шаблон пустой страницы (WinUI). Присвойте файлу NotePage.xamlимя и нажмите кнопку "Добавить".
Файл NotePage.xaml откроется на новой вкладке, отображая всю разметку XAML, представляющую пользовательский интерфейс страницы. Замените элемент
<Grid> ... </Grid>в XAML на следующую разметку:<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>Сохраните файл, нажав клавиши CTRL+S, щелкнув значок "Сохранить" на панели инструментов или выбрав в меню пункт Файл>Сохранить NotePage.xaml.
Если вы запускаете приложение прямо сейчас, вы не увидите только что созданную страницу заметок. Это связано с тем, что вам все еще нужно установить его в качестве содержимого элемента управления
FrameвMainWindow.Откройте MainWindow.xaml, и задайте
NotePageв качестве SourcePageType наFrame, в следующем виде:<Frame x:Name="rootFrame" Grid.Row="1" SourcePageType="local:NotePage"/>Теперь, когда вы запускаете приложение,
Frameзагружает экземплярNotePageи отображает его пользователю.
Это важно
Сопоставления пространства имен XAML (xmlns) являются аналогом XAML инструкции C# using .
local: — это префикс, сопоставленный для вас на страницах XAML для проекта приложения (xmlns:local="using:WinUINotes"). Он сопоставляется с тем же пространством имен, которое создано для хранения x:Class атрибута и кода для всех файлов XAML, включая App.xaml. Если вы определяете любые пользовательские классы, которые вы хотите использовать в XAML в этом же пространстве имен, можно использовать local: префикс для ссылки на пользовательские типы в XAML.
Давайте разберем ключевые части элементов управления XAML, размещенные на странице:
Grid.RowDefinitions и Grid.ColumnDefinitions определяют сетку с 2 строками и 3 столбцами (помещенными под строкой заголовка).
- Нижняя строка автоматически изменяет размер под своё содержимое, две кнопки. Верхняя строка использует все оставшееся вертикальное пространство (
*). - Средний столбец имеет
400ширину epx и находится в том месте, где идет редактор заметок. Столбцы по обеим сторонам пусты и разделяют все оставшееся горизонтальное пространство между ними (*).
Замечание
Из-за того, как работает система масштабирования, при разработке приложения XAML вы работаете с эффективными пикселями, а не физическими пикселями. Эффективные пиксели (epx) — это виртуальная единица измерения, и они используются для выражения измерений макета и интервалов, независимо от плотности экрана.
- Нижняя строка автоматически изменяет размер под своё содержимое, две кнопки. Верхняя строка использует все оставшееся вертикальное пространство (
<TextBox x:Name="NoteEditor" ... > ... </TextBox>— это элемент управления ввода текста (TextBox), настроенный для редактирования текста в нескольких строках, и помещается в ячейку верхней центральной частиGrid(Grid.Column="1"). Индексы строк и столбцов основаны на 0, и по умолчанию элементы управления помещаются в строку 0 и столбец 0 родительского элементаGrid. Таким образом, это эквивалент указания строки 0, столбца 1.<StackPanel Orientation="Horizontal" ... > ... </StackPanel>определяет элемент управления макетом (StackPanel), который располагает дочерние элементы по вертикали (по умолчанию) или горизонтально. Он помещается в нижнюю центральную ячейкуGrid(Grid.Row="1" Grid.Column="1").Замечание
Grid.Row="1" Grid.Column="1"— это пример присоединённых свойств XAML. Присоединенные свойства позволяют одному объекту XAML задать свойство, которое принадлежит другому объекту XAML. Часто дочерние элементы могут использовать присоединенные свойства для информирования родительского элемента о том, как они должны быть представлены в пользовательском интерфейсе.Два
<Button>элемента управления находятся внутри<StackPanel>и упорядочены по горизонтали. Вы добавите код для обработки событий нажатия кнопки в следующем разделе.
Дополнительные сведения см. в документации:
Загрузка и сохранение заметки
NotePage.xaml.cs Откройте файл программной части. При добавлении нового XAML-файла программный код содержит одну строку в конструкторе: вызов метода InitializeComponent.
namespace WinUINotes
{
public sealed partial class NotePage : Page
{
public NotePage()
{
this.InitializeComponent();
}
}
}
Метод InitializeComponent считывает разметку XAML и инициализирует все объекты, определенные разметкой. Объекты связаны в иерархических отношениях родитель-потомок, а обработчики событий, определенные в коде, подключены к событиям, определённым в XAML.
Теперь вы добавите код в NotePage.xaml.cs файл программной части для обработки загрузки и сохранения заметок.
Добавьте следующие объявления переменных в класс
NotePage:public sealed partial class NotePage : Page { private StorageFolder storageFolder = ApplicationData.Current.LocalFolder; private StorageFile? noteFile = null; private string fileName = "note.txt";При сохранении заметки она сохраняется в локальном хранилище приложения в виде текстового файла.
Класс StorageFolder используется для доступа к локальной папке данных приложения. Эта папка связана с приложением, поэтому заметки, сохраненные здесь, не могут быть доступны другим приложениям. Класс StorageFile используется для доступа к текстовому файлу, сохраненном в этой папке. Имя файла представлено переменной
fileName. Теперь задайтеfileNameна "note.txt".Создайте обработчик событий для события loaded страницы заметок.
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); } }В этом методе вызывается TryGetItemAsync , чтобы получить текстовый файл из папки. Если файл не существует, он возвращается
null. Если файл существует, вызовите ReadTextAsync , чтобы считывать текст из файла вNoteEditorсвойство Text элемента управления. (Помните, чтоNoteEditor- это элемент управления, который вы создали с помощьюTextBoxв XAML-файле. Вы ссылаетесь на него в файле с кодом, используя назначенный емуx:Name.)Это важно
Этот метод необходимо пометить ключевым
asyncсловом, так как вызовы доступа к файлам являются асинхронными. Короче говоря, при вызове метода, заканчивающегося...Async(напримерTryGetItemAsync), можно добавить оператор await в вызов. Это предотвращает выполнение последующего кода до завершения ожидаемого вызова и сохраняет отзывчивость вашего пользовательского интерфейса. При использованииawait, метод, который вы вызываете, необходимо пометить ключевым словом async. Дополнительные сведения см. в статье "Вызов асинхронных API" в C#.
Дополнительные сведения см. в документации:
Добавление обработчиков событий
Затем добавьте обработчики событий Click для кнопок "Сохранить и удалить". Добавление обработчиков событий — это то, что вы будете делать часто при создании приложений, поэтому Visual Studio предоставляет несколько функций, чтобы упростить работу.
В файле NotePage.xaml поместите курсор после атрибута
Contentв элементе управления СохранитьButton. ВведитеClick=. На этом этапе в Visual Studio должен появиться интерфейс автозавершения, который выглядит следующим образом:
- Нажмите клавишу СТРЕЛКА ВНИЗ, чтобы выбрать <новый обработчик> событий, а затем нажмите клавишу TAB. Visual Studio завершит атрибут и
Click="Button_Click"добавит метод обработчика событий, названныйButton_Clickв файле кода программной NotePage.xaml.cs части.
Теперь вы должны переименовать метод
Button_Clickна более осмысленное название. Это будет выполняться в следующих шагах.- Нажмите клавишу СТРЕЛКА ВНИЗ, чтобы выбрать <новый обработчик> событий, а затем нажмите клавишу TAB. Visual Studio завершит атрибут и
В NotePage.xaml.csнайдите метод, который был добавлен для вас:
private void Button_Click(object sender, RoutedEventArgs e) { }Подсказка
Чтобы найти код в приложении, щелкните "Поиск " в строке заголовка Visual Studio и используйте параметр "Поиск кода ". Дважды щелкните результат поиска, чтобы открыть код в редакторе кода.
Поместите курсор перед "B" в
Buttonи введитеSave. Подождите момент, и имя метода будет выделено зеленым цветом.При наведении указателя мыши на имя метода Visual Studio отобразит подсказку со значком отвертки или лампочки. Нажмите кнопку со стрелкой вниз рядом со значком, а затем нажмите Переименовать "Button_Click" в "SaveButton_Click".
Visual Studio переименовывает метод везде в вашем приложении, включая XAML-файл, в который вы сначала добавили его в
Button.Повторите эти действия для кнопки Delete и переименуйте метод
DeleteButton_Clickв .
Теперь, когда обработчики событий подключены, можно добавить код для сохранения и удаления файла заметок.
Добавьте этот код в
SaveButton_Clickметод для сохранения файла. Обратите внимание, что также необходимо обновить сигнатуру метода с помощью ключевогоasyncслова.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); }В методе
SaveButton_Clickсначала проверьте, был ли созданnoteFile. Если этоnull, необходимо создать новый файл в локальной папке хранения с именем, представленным переменнойfileName, и присвоить этот файл переменнойnoteFile. Затем вы записываете текст в элемент управленияTextBox, в файл, представленныйnoteFile.Добавьте этот код в
DeleteButton_Clickметод для удаления файла. Здесь также необходимо обновить сигнатуру метода сasyncключевым словом.private async void DeleteButton_Click(object sender, RoutedEventArgs e) { if (noteFile is not null) { await noteFile.DeleteAsync(); noteFile = null; NoteEditor.Text = string.Empty; } }В методе
DeleteButton_Clickсначала проверяется, существует лиnoteFile. При этом удалите файл, представленныйnoteFileиз локальной папки хранилища, и задайте для него значениеnoteFilenull. Затем сбросьте текст в элементе управленияTextBoxна пустую строку.Это важно
После удаления текстового файла из файловой системы важно задать значение
noteFilenull. Помните, чтоnoteFileэто StorageFile , предоставляющий доступ к системным файлам в приложении. После удаленияnoteFileсистемного файла по-прежнему указывает на то, где находится системный файл, но не знает, что он больше не существует. Если вы пытаетесь прочитать, написать или удалить системный файл сейчас, вы получите ошибку.Сохраните файл, нажав клавиши CTRL+S, щелкнув значок "Сохранить" на панели инструментов или выбрав в меню пункт Файл>Сохранить NotePage.xaml.cs.
Окончательный код файла программной части должен выглядеть следующим образом:
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;
}
}
}
}
Проверка заметки
С помощью этого кода вы можете протестировать приложение, чтобы убедиться, что заметки сохраняются и загружаются правильно.
- Создайте и запустите проект, нажав клавишу F5, нажав кнопку отладки "Пуск" на панели инструментов или выбрав меню Запустить>отладку.
- Введите текст в текстовое поле и нажмите кнопку "Сохранить ".
- Закройте приложение, а затем перезапустите его. Введенное примечание должно быть загружено из хранилища устройства.
- Нажмите кнопку "Удалить ".
- Закройте приложение, перезапустите его. У вас должна появиться новая пустая заметка.
Это важно
После подтверждения правильности сохранения и удаления заметки создайте и сохраните новую заметку снова. Вы хотите сохранить заметку, чтобы протестировать приложение на последующих шагах.
Windows developer