Xamarin.Forms Slovníky prostředků

Download Sample Stažení ukázky

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 , VisualElementvč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 nebo ButtonLabel lze použít pouze u daného objektu.
  • Prostředky připojené ResourceDictionary k rozložení, například StackLayout nebo Grid 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 ResourceDictionaryStaticResource 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:

Consuming ResourceDictionary Resources

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:

  1. Přidejte vlastní Preserve atribut do sestavení obsahujícího samostatné soubory XAML. Další informace naleznete v tématu Zachování kódu.

  2. 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 ResourceDictionarystrá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 ResourceDictionarymůž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:

  1. Prostředky místní pro slovník prostředků.
  2. 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 ve MergedDictionaries 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.

Další videa o Xamarinu najdete na Channel 9 a YouTube.