Skapa och använda programomfattande resurser
Att definiera resurser och format på en XAML-sida (Extensible Application Markup Language) är ett bra sätt att minska upprepad kod. Men det är ett problem. Dessa resurser och formatmallar är endast tillgängliga på den specifika XAML-sidan. Resursordlistor på sidnivå räcker inte för att undvika upprepad kod i ett program när du har flera sidor. I den här lektionen ser du hur du delar resurser och format på alla sidor i ditt MAUI-program (Multi-Platform App UI).
Där resursordlistor är tillgängliga
Klassen VisualElement definierar egenskapen Resurser . Kontroller, sidor och layouter ärver från VisualElement, så alla har en resursegenskap som kan innehålla en resursordlista.
Klassen Program definierar också en resursegenskap . Programmet ärver inte från VisualElement, så egenskapen definieras som en del av den här klassen.
Följande bild visar strukturen för ett typiskt program. Vart och ett av de element som visas har en resursegenskap som kan innehålla en resursordlista.
Kommentar
Det här diagrammet visar en mycket förenklad bild av hur objekten i ett program organiseras. I det här diagrammet refererar termen Vy till en singleton-kontroll, till exempel Knapp eller Etikett som inte fungerar som en container för underordnade kontroller. Termen Layout innebär också en container som ansvarar för att organisera layouten för dess underordnade kontroller. En layout kan kapslas. Till exempel kan en rutnätskontroll hållas inom en StackLayout-kontroll .
Definiera resurser och format på programnivå
Du definierar resurser och format på programnivå i XAML-filen som är associerad med din programklass . Följande kod visar hur du deklarerar en färgresurs i programresursordlistan.
<Application.Resources>
<Color x:Key="MyTextColor">Blue</Color>
</Application.Resources>
Så här letar .NET MAUI upp en resurs eller ett format
Anta att du tillämpar en resurs på en av dina kontroller enligt följande kod.
<Label TextColor="{StaticResource MyTextColor}" ... />
.NET MAUI måste hitta definitionen av resursen så att den kan tillämpa värdet. Ett enda program kan ha många ordlistor. Vilka ordlistor ska .NET MAUI söka efter och i vilken ordning? För att besvara dessa frågor hjälper det att tänka på VisualElement-instanserna på sidor som en trädliknande struktur. Programmet finns i roten, med sidor, layouter och vyer som sprids ut under det. Den här strukturen kallas ofta för det visuella trädet. Varje element i trädet kan ha en egen ordlista som kan innehålla resurser. Formatsökalgoritmen i .NET MAUI går upp i det visuella trädet:
Börja sökningen med ordlistan i VisualElement-instansen som resursen tillämpas på. I föregående exempel börjar sökningen med typen Etikett . Om det inte finns någon resursordlista, eller om den har en ordlista men resursen inte finns, går sökningen vidare.
Flytta till överordnad (kontroll) och upprepa sökningen. Normalt är nästa plats som ska genomsökas en layout.
Kontrollera layoutens överordnad. Normalt är nästa plats som ska sökas på sidan, men om en layout är kapslad i en annan layout (till exempel ett rutnät i en StackLayout) flyttas sökningen upp i trädet till den överordnade layouten.
Leta efter klassen Program i ordlistan.
Sökningen returnerar det första objektet som hittades med ett matchande x:Key-värde . Följande bild sammanfattar resurssökningssekvensen.
I praktiken ignorerar de flesta utvecklare egenskapen Resurser i vyer och layouter. De använder ordlistorna på sidnivå för saker de använder på en enda sida. Resurser och formatmallar som de vill dela över flera sidor definieras på programnivå. Uppslagsprocessen behöver sedan bara kontrollera två ordlistor: den i den aktuella sidinstansen och den i programmet.
Kommentar
Om en resurs med den angivna nyckeln inte hittas använder appen standardvärden för formateringen.
Duplicerade nycklar
Varje ResourceDictionary-instans är oberoende, vilket innebär att samma x:Key-värde kan användas i mer än en ordlista. Att ha samma x:Key-identifierare i flera ordlistor på sökvägen orsakar inget fel. Resursen som är associerad med det första matchande x:Key-värdet på sökvägen är den som används.
Anta till exempel att du har följande resurs definierad i klassen Program :
<Application.Resources>
<x:String x:Key="msg">Two</x:String>
</Application.Resources>
Sedan definierar du följande resurs i en ContentPage och tillämpar den på en etikett på samma sida:
<ContentPage.Resources>
<x:String x:Key="msg">One</x:String>
</ContentPage.Resources>
...
<Label Text="{StaticResource msg}">
Eftersom det första matchande x:Key-värdet används är egenskapen Text inställd på One.