Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Most létrehoz egy lapot, amely lehetővé teszi, hogy a felhasználó szerkessze a jegyzetet, majd megírja a kódot a jegyzet mentéséhez vagy törléséhez.
Jótanács
Az oktatóanyag kódját a GitHub-adattárból töltheti le vagy tekintheti meg. A jelen lépésben szereplő kód megtekintéséhez tekintse meg a következő véglegesítést: jegyzetoldal – kezdeti.
Először adja hozzá az új lapot a projekthez:
A Visual Studio Megoldáskezelő paneljén kattintson a jobb gombbal az Új elem hozzáadása>WinUINotes>
Az Új elem hozzáadása párbeszédpanelen válassza a WinUI lehetőséget az ablak bal oldalán található sablonlistában. Ezután válassza ki az Üres lap (WinUI 3) sablont. Nevezze el a fájlt NotePage.xaml, majd válassza a Hozzáadás lehetőséget.
A NotePage.xaml fájl egy új lapon nyílik meg, amely megjeleníti az oldal felhasználói felületét képviselő összes XAML-jelölőt. Cserélje le az
<Grid> ... </Grid>XAML elemét a következő korrektúrára:<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>Mentse a fájlt a CTRL+ S billentyűkombináció lenyomásával, az eszközsáv Mentés ikonjára kattintva vagy a Fájl>mentése NotePage.xamlmenüre kattintva.
Ha most futtatja az alkalmazást, nem fogja látni az imént létrehozott jegyzetoldalt. Ennek az az oka, hogy továbbra is be kell állítania a vezérlőelem tartalmaként a
FramekövetkezőbenMainWindow: .Nyissa meg MainWindow.xaml és állítsa be
NotePageSourcePageType-ként aFramekövetkező módon:<Frame x:Name="rootFrame" Grid.Row="1" SourcePageType="local:NotePage"/>Most, amikor futtatja az alkalmazást, a
Framerendszer betölt egy példánytNotePage, és megjeleníti azt a felhasználónak.
Fontos
Az XAML-névtér (xmlns) leképezései a C# using utasítás XAML-megfelelője.
local: egy előtag, amely az alkalmazásprojekt XAML-oldalain (xmlns:local="using:WinUINotes") van leképezve. A rendszer arra a névtérre hivatkozik, amely az összes XAML-fájl attribútumát és kódját tartalmazza x:Class , beleértve App.xamla . Ha az XAML-ben azonos névtérben használni kívánt egyéni osztályokat definiálja, az local: előtaggal hivatkozhat az XAML egyéni típusaira.
Bontsuk le az oldalon elhelyezett XAML-vezérlők főbb részeit:
A Grid.RowDefinitions és a Grid.ColumnDefinitions egy 2 sorból és 3 oszlopból álló rácsot határoz meg (a címsor alatt).
- Az alsó sor automatikusan (
Auto) úgy van méretezve, hogy illeszkedjen a tartalmához, a két gombhoz. A felső sor az összes fennmaradó függőleges területet (*) használja. - A középső oszlop
400epx széles, és a jegyzetszerkesztő oda kerül. A két oldalon lévő oszlopok üresek, és a fennmaradó vízszintes térközt felosztják közöttük (*).
Megjegyzés:
A skálázási rendszer működése miatt az XAML-alkalmazás tervezésekor hatékony képpontokkal tervez, nem tényleges fizikai képpontokkal. Az effektív képpontok (epx) virtuális mértékegységek, és a képernyő sűrűségétől független elrendezési méretek és térközök kifejezésére szolgálnak.
- Az alsó sor automatikusan (
<TextBox x:Name="NoteEditor" ... > ... </TextBox>egy többsoros szövegbevitelhez konfigurált szövegbevitel-vezérlő (TextBox), amely a (Grid) felső középső cellájábaGrid.Column="1"kerül. A sor- és oszlopindexek 0-alapúak, és alapértelmezés szerint a vezérlők a szülőGrid0. és 0. sorába kerülnek. Ez tehát a 0. sor 1. oszlopának megadásával egyenértékű.<StackPanel Orientation="Horizontal" ... > ... </StackPanel>Egy elrendezésvezérlőt (StackPanel) határoz meg, amely függőlegesen (alapértelmezett) vagy vízszintesen veri a gyermekeket. A(z) (Grid) alsó középső cellájábaGrid.Row="1" Grid.Column="1"kerül.Megjegyzés:
Grid.Row="1" Grid.Column="1"egy példa az XAML-hez csatolt tulajdonságokra. A csatolt tulajdonságok lehetővé teszik, hogy egy XAML-objektum egy másik XAML-objektumhoz tartozó tulajdonságot állítson be. Gyakran előfordul, hogy a gyermekelemek a csatolt tulajdonságok használatával tájékoztatják a szülőelemet arról, hogyan jelenjenek meg a felhasználói felületen.Két
<Button>vezérlő található a<StackPanel>belsejében, és vízszintesen vannak elrendezve. A következő szakaszban a gombok kattintási eseményeit kezelő kódot fogja hozzáadni.
További információ a dokumentumokban:
Jegyzet betöltése és mentése
Nyissa meg a NotePage.xaml.cs kód mögötti fájlt. Új XAML-fájl hozzáadásakor a mögöttes kód egyetlen sort tartalmaz a konstruktorban, a InitializeComponent metódus hívását:
namespace WinUINotes
{
public sealed partial class NotePage : Page
{
public NotePage()
{
this.InitializeComponent();
}
}
}
A InitializeComponent metódus beolvassa az XAML-korrektúrát, és inicializálja a korrektúra által definiált összes objektumot. Az objektumok a szülő-gyermek kapcsolatokban vannak összekapcsolva, és a kódban definiált eseménykezelők az XAML-ben beállított eseményekhez vannak csatolva.
Most kódot fog hozzáadni a kód mögötti fájlhoz a NotePage.xaml.cs jegyzetek betöltésének és mentésének kezeléséhez.
Adja hozzá a következő változódeklarációkat az
NotePageosztályhoz:public sealed partial class NotePage : Page { private StorageFolder storageFolder = ApplicationData.Current.LocalFolder; private StorageFile? noteFile = null; private string fileName = "note.txt";A jegyzetek mentésekor a rendszer szövegfájlként menti az alkalmazás helyi tárhelyére.
A StorageFolder osztály használatával érheti el az alkalmazás helyi adatmappáját. Ez a mappa az alkalmazásra vonatkozik, ezért az itt mentett jegyzeteket más alkalmazások nem érhetik el. A StorageFile osztály használatával érheti el a mappában mentett szövegfájlt. A fájl nevét a
fileNameváltozó jelöli. Egyelőre állítsa a "fileName" értéket.Hozzon létre egy eseménykezelőt a jegyzetoldal Betöltött eseményéhez.
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); } }Ebben a metódusban meghívja a TryGetItemAsync parancsot , hogy lekérje a szövegfájlt a mappából. Ha a fájl nem létezik, visszaadja a következőt
null: . Ha a fájl létezik, hívja meg a ReadTextAsync parancsot , hogy beolvassa a szöveget a fájlból aNoteEditorvezérlő Szöveg tulajdonságába. (Ne feledje,NoteEditorhogy azTextBoxXAML-fájlban létrehozott vezérlő. Itt hivatkozhat rá a kód mögötti fájlban ax:Namehozzá rendelt fájl használatával.)Fontos
Ezt a metódust a
asynckulcsszóval kell megjelölnie, mert a fájlelérési hívások aszinkronok. Röviden, ha egy (például)...AsyncvégződésűTryGetItemAsyncmetódust hív meg, hozzáadhatja a várakozási operátort a híváshoz. Ez megakadályozza a következő kód végrehajtását, amíg a várt hívás be nem fejeződik, és a felhasználói felület rugalmas marad. Ha használjaawait, az aszinkron kulcsszóval kell megjelölni a meghívni kívánt metódust. További információ: Aszinkron API-k meghívása C#-ban.
További információ a dokumentumokban:
Eseménykezelők hozzáadása
Ezután adja hozzá a Mentés és törlés gomb kattintási eseménykezelőinek elemét. Az eseménykezelők hozzáadása gyakran történik az alkalmazások létrehozásakor, így a Visual Studio számos funkciót kínál a könnyebbé tétele érdekében.
A fájlban helyezze a NotePage.xaml kurzort az
Contentattribútum mögé a MentésButtonvezérlőben. Gépelje be:Click=. Ezen a ponton a Visual Studiónak elő kell állítania egy automatikusan kitöltendő felhasználói felületet, amely így néz ki:
- Nyomja le a lefelé mutató nyílbillentyűt az Új eseménykezelő< kiválasztásához>, majd nyomja le a Tab billentyűt. A Visual Studio az attribútumot a kód mögötti fájlban
Click="Button_Click"elnevezettButton_Clickeseménykezelő metódussal NotePage.xaml.cs egészíti ki és adja hozzá.
Most nevezze át a metódust
Button_Clickvalami értelmesebbre. Ezt a következő lépésekben teheti meg.- Nyomja le a lefelé mutató nyílbillentyűt az Új eseménykezelő< kiválasztásához>, majd nyomja le a Tab billentyűt. A Visual Studio az attribútumot a kód mögötti fájlban
Keresse NotePage.xaml.csmeg az Önhöz hozzáadott metódust:
private void Button_Click(object sender, RoutedEventArgs e) { }Jótanács
Ha meg szeretné keresni a kódot az alkalmazásban, kattintson a Keresés gombra a Visual Studio címsorában, és használja a Kódkeresés lehetőséget. Kattintson duplán a keresési eredményre a kódszerkesztőben való megnyitásához.
Helyezze a kurzort a "B" elé, és írja be a következőt
ButtonSave: Várjon egy kis időt, és a metódus neve zöld színnel lesz kiemelve.Ha a metódus nevére mutat, a Visual Studio egy elemleírást jelenít meg egy csavarhúzóval vagy villanykörte ikonnal. Kattintson az ikon melletti lefelé mutató nyílra, majd a "Button_Click" átnevezése a következőre: "SaveButton_Click".
A Visual Studio mindenhol átnevezi a metódust az alkalmazásban, beleértve azt az XAML-fájlt is, amelyben először hozzáadta a
Buttonmetódushoz.Ismételje meg ezeket a lépéseket a Törlés gombnál, és nevezze át a metódust a következőre
DeleteButton_Click: .
Az eseménykezelők csatlakoztatása után hozzáadhatja a kódot a jegyzetfájl mentéséhez és törléséhez.
A fájl mentéséhez adja hozzá ezt a
SaveButton_Clickkódot a metódushoz. Figyelje meg, hogy a metódus aláírását is frissítenie kell aasynckulcsszóval.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); }A metódusban
SaveButton_Clickelőször ellenőrizze, hogy létrejött-enoteFile. Ha így vannull, akkor létre kell hoznia egy új fájlt a helyi tármappában a változó általfileNameképviselt névvel, és hozzá kell rendelnie a fájlt anoteFileváltozóhoz. Ezután a vezérlőelemben lévőTextBoxszöveget az általanoteFileképviselt fájlba írja.Adja hozzá ezt a kódot a
DeleteButton_Clickfájl törléséhez a metódusban. Itt is frissítenie kell a metódus-aláírást aasynckulcsszóval.private async void DeleteButton_Click(object sender, RoutedEventArgs e) { if (noteFile is not null) { await noteFile.DeleteAsync(); noteFile = null; NoteEditor.Text = string.Empty; } }A metódusban
DeleteButton_Clickelőször ellenőrizze, hogy létezik-enoteFile. Ha igen, törölje a helyi tármappa általnoteFileképviselt fájlt, és állítsa benoteFilea következőrenull: . Ezután állítsa vissza a vezérlőelem szövegétTextBoxegy üres sztringre.Fontos
Miután törölte a szövegfájlt a fájlrendszerből, fontos a beállítás
noteFile.nullNe feledje, hogynoteFileez egy StorageFile , amely hozzáférést biztosít az alkalmazás rendszerfájljához. A rendszerfájl törlése után továbbra is arra mutat,noteFilehogy hol volt a rendszerfájl, de nem tudja, hogy már nem létezik. Ha most megpróbálja elolvasni, írni vagy törölni a rendszerfájlt, hibaüzenet jelenik meg.Mentse a fájlt a CTRL+ S billentyűkombináció lenyomásával, az eszközsáv Mentés ikonjára kattintva vagy a Fájl>mentése NotePage.xaml.csmenüre kattintva.
A kód mögötti fájl végső kódjának a következőképpen kell kinéznie:
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;
}
}
}
}
A jegyzet tesztelése
Ezzel a kóddal tesztelheti az alkalmazást, így meggyőződhet arról, hogy a jegyzet mentése és betöltése megfelelően történik.
- A projekt létrehozásához és futtatásához nyomja le az F5 billentyűt, kattintson a Hibakeresés "Start" gombra az eszközsávon, vagy válassza a Hibakeresés indítása> menüt.
- Írja be a szövegbeviteli mezőbe, és nyomja le a Mentés gombot.
- Zárja be az alkalmazást, majd indítsa újra. A megadott megjegyzést az eszköz tárolójából kell betölteni.
- Nyomja le a Delete (Törlés ) gombot.
- Zárja be az alkalmazást, indítsa újra. Új üres jegyzetet kell bemutatnia.
Fontos
Miután meggyőződött arról, hogy a jegyzet mentése és törlése helyesen működik, hozzon létre és mentsen újra egy új jegyzetet. Egy mentett jegyzetet szeretne készíteni az alkalmazás későbbi lépésekben való teszteléséhez.
Windows developer