Xamarin.Forms Slovníky prostředků
A ResourceDictionary
je úložiště pro prostředky, které aplikace používá Xamarin.Forms . Typické prostředky, které jsou uložené v ResourceDictionary
zahrnutí stylů, ovládacích šablon, šablon dat, barev a převaděčů.
V JAZYCE XAML je možné odkazovat na prostředky, které jsou uložené v elementech ResourceDictionary
, a použít je na prvky pomocí StaticResource
rozšíření značek DynamicResource
. V jazyce C# lze prostředky také definovat v indexeru ResourceDictionary
založeném na řetězci a pak na ni odkazovat a použít. Použití v jazyce C# ale má malou výhodu ResourceDictionary
, protože sdílené objekty se dají uložit jako pole nebo vlastnosti a přistupovat k nim přímo, aniž byste je museli nejdřív načíst ze slovníku.
Vytváření prostředků v XAML
Každý VisualElement
odvozený objekt má Resources
vlastnost, což je ResourceDictionary
objekt, který může obsahovat prostředky. Podobně má odvozený Application
objekt Resources
vlastnost, což je ResourceDictionary
vlastnost, která může obsahovat prostředky.
Xamarin.Forms Aplikace obsahuje pouze třídu odvozenou od Application
, ale často používá mnoho tříd, které jsou odvozeny , VisualElement
včetně stránek, rozložení a ovládacích prvků. Jakýkoli z těchto objektů může mít vlastnost Resources
nastavenou ResourceDictionary
na obsahující prostředky. Volba umístění konkrétního ResourceDictionary
dopadu na použití prostředků:
- Prostředky v
ResourceDictionary
připojeném k zobrazení, jako je neboButton
Label
lze použít pouze u daného objektu. - Prostředky připojené
ResourceDictionary
k rozložení, napříkladStackLayout
neboGrid
je možné je použít pro rozložení a všechny podřízené položky tohoto rozložení. - Prostředky definované
ResourceDictionary
na úrovni stránky lze použít na stránku a pro všechny její podřízené položky. - Prostředky definované
ResourceDictionary
na úrovni aplikace je možné použít v celé aplikaci.
S výjimkou implicitních stylů musí mít každý prostředek ve slovníku prostředků jedinečný řetězcový klíč, který je definovaný pomocí atributu x:Key
.
Následující xaml ukazuje prostředky definované na úrovni ResourceDictionary
aplikace v souboru App.xaml :
<Application xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="ResourceDictionaryDemo.App">
<Application.Resources>
<Thickness x:Key="PageMargin">20</Thickness>
<!-- Colors -->
<Color x:Key="AppBackgroundColor">AliceBlue</Color>
<Color x:Key="NavigationBarColor">#1976D2</Color>
<Color x:Key="NavigationBarTextColor">White</Color>
<Color x:Key="NormalTextColor">Black</Color>
<!-- Implicit styles -->
<Style TargetType="{x:Type NavigationPage}">
<Setter Property="BarBackgroundColor"
Value="{StaticResource NavigationBarColor}" />
<Setter Property="BarTextColor"
Value="{StaticResource NavigationBarTextColor}" />
</Style>
<Style TargetType="{x:Type ContentPage}"
ApplyToDerivedTypes="True">
<Setter Property="BackgroundColor"
Value="{StaticResource AppBackgroundColor}" />
</Style>
</Application.Resources>
</Application>
V tomto příkladu slovník prostředků definuje Thickness
prostředek, více Color
prostředků a dva implicitní Style
prostředky. Další informace o App
třídě najdete v tématu Xamarin.Forms Třída aplikace.
Poznámka:
Je také platné umístit všechny prostředky mezi explicitní ResourceDictionary
značky. Vzhledem k tomu, že Xamarin.Forms 3.0 ResourceDictionary
nejsou značky povinné. ResourceDictionary
Místo toho se objekt vytvoří automaticky a prostředky můžete vložit přímo mezi Resources
značky prvku vlastnosti.
Využívání prostředků v XAML
Každý prostředek má klíč zadaný pomocí atributu x:Key
, který se stane jeho slovníkovým klíčem v souboru ResourceDictionary
. Klíč se používá k odkazování na prostředek z ResourceDictionary
StaticResource
rozšíření nebo DynamicResource
značek.
Rozšíření StaticResource
značek je podobné DynamicResource
rozšíření značek v tom, že obě používají klíč slovníku k odkazování na hodnotu ze slovníku prostředků. Zatímco StaticResource
rozšíření značek provádí jedno vyhledávání slovníku, DynamicResource
rozšíření značek udržuje odkaz na klíč slovníku. Proto pokud je položka slovníku přidružená ke klíči nahrazena, změna se použije u vizuálního prvku. To umožňuje provádět změny prostředků modulu runtime v aplikaci. Další informace o rozšířeních značek najdete v tématu Rozšíření značek XAML.
Následující příklad XAML ukazuje, jak využívat prostředky a také definuje další prostředky v StackLayout
:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="ResourceDictionaryDemo.HomePage"
Title="Home Page">
<StackLayout Margin="{StaticResource PageMargin}">
<StackLayout.Resources>
<!-- Implicit style -->
<Style TargetType="Button">
<Setter Property="FontSize" Value="Medium" />
<Setter Property="BackgroundColor" Value="#1976D2" />
<Setter Property="TextColor" Value="White" />
<Setter Property="CornerRadius" Value="5" />
</Style>
</StackLayout.Resources>
<Label Text="This app demonstrates consuming resources that have been defined in resource dictionaries." />
<Button Text="Navigate"
Clicked="OnNavigateButtonClicked" />
</StackLayout>
</ContentPage>
V tomto příkladu ContentPage
objekt využívá implicitní styl definovaný ve slovníku prostředků na úrovni aplikace. Objekt StackLayout
využívá PageMargin
prostředek definovaný ve slovníku prostředků na úrovni aplikace, zatímco Button
objekt využívá implicitní styl definovaný ve slovníku StackLayout
prostředků. Výsledkem je vzhled zobrazený na následujících snímcích obrazovky:
Důležité
Prostředky, které jsou specifické pro jednu stránku, by neměly být zahrnuty do slovníku prostředků na úrovni aplikace, například tyto prostředky se pak budou analyzovat při spuštění aplikace místo toho, když je vyžaduje stránka. Další informace naleznete v tématu Zmenšení velikosti slovníku prostředků aplikace.
Chování vyhledávání prostředků
K následujícímu procesu vyhledávání dochází v případě, že se na prostředek odkazuje s rozšířením nebo DynamicResource
rozšířením StaticResource
značek:
- Požadovaný klíč je zkontrolován ve slovníku prostředků, pokud existuje, pro element, který nastaví vlastnost. Pokud se požadovaný klíč najde, vrátí se jeho hodnota a proces vyhledávání se ukončí.
- Pokud se shoda nenajde, vyhledávací proces prohledá vizuální strom směrem nahoru a zkontroluje slovník prostředků každého nadřazeného prvku. Pokud se požadovaný klíč najde, vrátí se jeho hodnota a proces vyhledávání se ukončí. Jinak proces pokračuje vzhůru, dokud se nedosáhne kořenového prvku.
- Pokud se shoda nenajde v kořenovém prvku, prozkoumá se slovník prostředků na úrovni aplikace.
- Pokud se shoda stále nenajde, vyvolá
XamlParseException
se vyvolá.
Proto když analyzátor XAML narazí na StaticResource
rozšíření nebo DynamicResource
rozšíření značek, vyhledá odpovídající klíč tak, že přejde nahoru přes vizuální strom a použije první shodu, kterou najde. Pokud toto hledání končí na stránce a klíč stále nebyl nalezen, analyzátor XAML prohledá ResourceDictionary
připojený k objektu App
. Pokud se klíč stále nenajde, vyvolá se výjimka.
Přepsání prostředků
Když prostředky sdílejí klíče, budou mít prostředky definované nižší ve stromu vizuálu přednost před prostředky definovanými výše. Například nastavení AppBackgroundColor
prostředku na AliceBlue
úrovni aplikace bude přepsáno prostředkem na úrovni AppBackgroundColor
stránky nastaveným na Teal
. Podobně se prostředek na úrovni AppBackgroundColor
stránky přepíše prostředkem na úrovni AppBackgroundColor
řízení.
Slovníky samostatných prostředků
Třída odvozená z ResourceDictionary
může být také v samostatném souboru XAML. Soubor XAML se pak dá sdílet mezi aplikacemi.
Pokud chcete takový soubor vytvořit, přidejte do projektu novou položku zobrazení obsahu nebo stránky obsahu (ale ne zobrazení obsahu nebo stránku obsahu pouze se souborem jazyka C#). Odstraňte soubor s kódem a v souboru XAML změňte název základní třídy z ContentView
nebo ContentPage
na ResourceDictionary
. Kromě toho odeberte x:Class
atribut z kořenové značky souboru.
Následující příklad XAML ukazuje ResourceDictionary
název MyResourceDictionary.xaml:
<ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<DataTemplate x:Key="PersonDataTemplate">
<ViewCell>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*" />
<ColumnDefinition Width="0.2*" />
<ColumnDefinition Width="0.3*" />
</Grid.ColumnDefinitions>
<Label Text="{Binding Name}"
TextColor="{StaticResource NormalTextColor}"
FontAttributes="Bold" />
<Label Grid.Column="1"
Text="{Binding Age}"
TextColor="{StaticResource NormalTextColor}" />
<Label Grid.Column="2"
Text="{Binding Location}"
TextColor="{StaticResource NormalTextColor}"
HorizontalTextAlignment="End" />
</Grid>
</ViewCell>
</DataTemplate>
</ResourceDictionary>
V tomto příkladu ResourceDictionary
obsahuje jeden prostředek, což je objekt typu DataTemplate
. Soubor MyResourceDictionary.xaml lze použít sloučením do jiného slovníku prostředků.
Ve výchozím nastavení linker odebere samostatné soubory XAML z sestavení vydaných verzí, když je chování linkeru nastavené tak, aby propojilo všechna sestavení. Pokud chcete zajistit, aby samostatné soubory XAML zůstaly v sestavení vydané verze:
Přidejte vlastní
Preserve
atribut do sestavení obsahujícího samostatné soubory XAML. Další informace naleznete v tématu Zachování kódu.Preserve
Nastavte atribut na úrovni sestavení:[assembly:Preserve(AllMembers = true)]
Další informace o propojení najdete v tématu Propojení aplikací Xamarin.iOS a Propojení v Androidu.
Slovníky sloučených prostředků
Sloučené slovníky prostředků kombinují jeden nebo více ResourceDictionary
objektů do jiného ResourceDictionary
.
Sloučení místních slovníků prostředků
Místní ResourceDictionary
soubor lze sloučit do jiného ResourceDictionary
vytvořením objektu ResourceDictionary
, jehož Source
vlastnost je nastavena na název souboru XAML s prostředky:
<ContentPage ...>
<ContentPage.Resources>
<!-- Add more resources here -->
<ResourceDictionary Source="MyResourceDictionary.xaml" />
<!-- Add more resources here -->
</ContentPage.Resources>
...
</ContentPage>
Tato syntaxe instanci MyResourceDictionary
třídy. Místo toho odkazuje na soubor XAML. Z tohoto důvodu se při nastavování Source
vlastnosti nevyžaduje soubor kódu a x:Class
atribut lze odebrat z kořenové značky souboru MyResourceDictionary.xaml .
Důležité
Vlastnost Source
lze nastavit pouze z XAML.
Sloučení slovníků prostředků z jiných sestavení
A ResourceDictionary
lze také sloučit do jiné ResourceDictionary
přidáním do MergedDictionaries
vlastnosti objektu ResourceDictionary
. Tato technika umožňuje sloučení slovníků prostředků bez ohledu na sestavení, ve kterém se nacházejí. Sloučení slovníků prostředků z externích sestavení vyžaduje ResourceDictionary
, aby byla akce sestavení nastavená na EmbeddedResource, aby měl soubor s kódem a definoval x:Class
atribut v kořenové značce souboru.
Upozorňující
Třída ResourceDictionary
také definuje MergedWith
vlastnost. Tato vlastnost je však zastaralá a již by neměla být použita.
Následující příklad kódu ukazuje dva slovníky prostředků, které se přidávají do MergedDictionaries
kolekce na úrovni ResourceDictionary
stránky:
<ContentPage ...
xmlns:local="clr-namespace:ResourceDictionaryDemo"
xmlns:theme="clr-namespace:MyThemes;assembly=MyThemes">
<ContentPage.Resources>
<ResourceDictionary>
<!-- Add more resources here -->
<ResourceDictionary.MergedDictionaries>
<!-- Add more resource dictionaries here -->
<local:MyResourceDictionary />
<theme:LightTheme />
<!-- Add more resource dictionaries here -->
</ResourceDictionary.MergedDictionaries>
<!-- Add more resources here -->
</ResourceDictionary>
</ContentPage.Resources>
...
</ContentPage>
V tomto příkladu se slovník prostředků ze stejného sestavení a slovník prostředků z externího sestavení sloučí do slovníku prostředků na úrovni stránky. Kromě toho můžete do značek elementů vlastností přidat i další ResourceDictionary
objekty MergedDictionaries
a další prostředky mimo tyto značky.
Důležité
V objektu ResourceDictionary
může být pouze jedna MergedDictionaries
značka elementu vlastnosti, ale můžete do ní vložit libovolný počet ResourceDictionary
objektů.
Při sloučení ResourceDictionary
prostředků sdílejí stejné x:Key
hodnoty atributů, Xamarin.Forms používá následující prioritu prostředku:
- Prostředky místní pro slovník prostředků.
- Prostředky obsažené ve slovníkech prostředků, které byly sloučeny prostřednictvím
MergedDictionaries
kolekce, v obráceném pořadí jsou uvedeny veMergedDictionaries
vlastnosti.
Poznámka:
Vyhledávání slovníků prostředků může být výpočetně náročný úkol, pokud aplikace obsahuje více velkých slovníků prostředků. Abyste se vyhnuli zbytečnému vyhledávání, měli byste zajistit, aby každá stránka v aplikaci používala pouze slovníky prostředků, které jsou vhodné pro danou stránku.
Související odkazy
- Rozšíření značek XAML
- Xamarin.Forms Styly
- Propojení aplikací Xamarin.iOS
- Propojení v Androidu
- ResourceDictionary API