Övning: Använda dynamiska resurser för att uppdatera element
I den här övningen använder du markeringstillägget DynamicResource för att uppdatera TipCalculator-användargränssnittet när resursvärdena ändras.
Den här övningen är en fortsättning på föregående övning. Använd antingen din befintliga lösning som utgångspunkt för de här stegen eller öppna TipCalculator-projektet i mappen exercise2/TipCalculator på den lagringsplats som du klonade i föregående övning.
Hitta upprepad kod
Appen implementerar enkla "ljusa" och "mörka" färgscheman för sidan StandardTipPage . Här undersöker du koden som används för att ändra färgerna.
Öppna filen StandardTipPage.xaml.cs .
Leta upp de två händelsehanterare som uppdaterar användargränssnittets färger.
private Color colorNavy = Colors.Navy; private Color colorSilver = Colors.Silver; ... void OnLight(object sender, EventArgs e) { LayoutRoot.BackgroundColor = colorSilver; tipLabel.TextColor = colorNavy; billLabel.TextColor = colorNavy; totalLabel.TextColor = colorNavy; tipOutput.TextColor = colorNavy; totalOutput.TextColor = colorNavy; } void OnDark(object sender, EventArgs e) { LayoutRoot.BackgroundColor = colorNavy; tipLabel.TextColor = colorSilver; billLabel.TextColor = colorSilver; totalLabel.TextColor = colorSilver; tipOutput.TextColor = colorSilver; totalOutput.TextColor = colorSilver; } ...
Observera hur koden uppdaterar färgerna för varje kontroll individuellt, vilket resulterar i upprepad kod.
Uppdatera resurser från kod
Du börjar med att skriva kod som uppdaterar några resurser som lagras i en sidas resursordlista.
Ta bort all kod från OnLight-metoden.
Lägg till följande kod som visas i metoden OnLight . Den här koden anger fgColor-resursen i sidans resursordlista till värdet i variabeln colorNavy och anger bgColor-resursen till värdet i variabeln colorSilver . Variablerna colorNavy och colorSilver använder metoden static Color.FromRgb , vilket gör det enkelt att konvertera ett hexadecimalt värde till en färg.
void OnLight(object sender, EventArgs e) { Resources["fgColor"] = colorNavy; Resources["bgColor"] = colorSilver; }
Upprepa de föregående två stegen för metoden OnDark , men ändra färgerna. Ange fgColor till colorSilver och bgColor till colorNavy.
void OnDark(object sender, EventArgs e) { Resources["fgColor"] = colorSilver; Resources["bgColor"] = colorNavy; }
Kör appen. Välj knapparna Mörk och Ljus . Användargränssnittet ändras inte. Även om koden ändrar resursvärdena i ordlistan sprids inte det nya värdet till användargränssnittet. Problemet är att du använder StaticResource-påläggstillägget för att ange värdena i XAML-koden.
Uppdatera användargränssnittet dynamiskt
Åtgärda problemet genom att ändra XAML så att uppdaterade resursvärden läses in i användargränssnittet.
Stoppa appen och öppna filen StandardTipPage.xaml .
Leta upp alla platser där du tilldelar färger från resursvärden. Ersätt användningen av StaticResource-påläggstillägget med DynamicResource, som du ser i det här exemplet.
<Grid x:Name ="LayoutRoot" BackgroundColor="{DynamicResource bgColor}" Padding="10"> ... <Label x:Name="billLabel" Text="Bill" TextColor="{DynamicResource fgColor}" ... /> <Label x:Name="tipLabel" Text="Tip" TextColor="{DynamicResource fgColor}" ... /> <Label x:Name="totalLabel" Text="Total" TextColor="{DynamicResource fgColor}" ... /> ...
Kommentar
Ändra inte egenskaperna FontSize från StaticResource till DynamicResource.
Kör appen. Välj knapparna Mörk och Ljus . Användargränssnittet uppdateras nu korrekt.