Xamarin.Forms slovníky prostředků

Ukázka stažení Stažení ukázky

A ResourceDictionary je úložiště pro prostředky, které Xamarin.Forms aplikace používá. Typické prostředky, které jsou uloženy v ResourceDictionary vložených ResourceDictionary, šablonách ovládacích prvků, šablonách dat, barvách a převaděčích.

V jazyce XAML mohou být prostředky, které jsou uloženy na, ResourceDictionary odkazovány a aplikovány na prvky StaticResource pomocí DynamicResource rozšíření nebo rozšíření značek. V jazyce C# lze prostředky také definovat v ResourceDictionary a pak odkazovat a použít na prvky pomocí indexeru založeného na řetězci. Používání jazyka v jazyce C# je však málo výhodné ResourceDictionary , protože sdílené objekty lze ukládat jako pole nebo vlastnosti a získat přímý pøístup bez nutnosti je načítat ze slovníku.

Vytváření prostředků v jazyce XAML

Každý VisualElement odvozený objekt má Xamarin_Forms VisualElement vlastnost _VisualElement_Resources data-LINKTYPE = "absolutní cesta" >Resources , která ResourceDictionary může obsahovat prostředky. Podobně Application odvozený objekt má Xamarin_Forms Application vlastnost _VisualElement_Resources data-LINKTYPE = "absolutní cesta" >Resources , která ResourceDictionary může obsahovat prostředky.

Xamarin.FormsAplikace obsahuje pouze třídu, která je odvozena z Application , ale často využívá mnoho tříd, které jsou odvozeny z VisualElement , včetně stránek, rozložení a ovládacích prvků. Každý z těchto objektů může mít Resources vlastnost nastavenou na ResourceDictionary obsahující prostředky. Výběr místa, kde se mají klást konkrétní ResourceDictionary dopady, kde je možné prostředky použít:

  • Prostředky v ResourceDictionary , které jsou připojeny k zobrazení, například Button nebo Label lze použít pouze pro tento konkrétní objekt.
  • Prostředky v ResourceDictionary připojené k rozložení, jako je StackLayout nebo, Grid lze použít na rozložení a všechny podřízené objekty tohoto rozložení.
  • Prostředky, které ResourceDictionary jsou definovány na úrovni stránky, lze použít na stránku a pro všechny její podřízené položky.
  • Prostředky ResourceDictionary definované na úrovni aplikace lze 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ý klíč řetězce, který je definován s x:Key atributem.

Následující XAML ukazuje prostředky definované na úrovni aplikace ResourceDictionary v souboru ResourceDictionary :

<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ě naleznete v tématu Xamarin.Forms App Class .

Poznámka

Je také platná pro všechny prostředky mezi explicitními ResourceDictionary značkami. Nicméně od Xamarin.Forms 3,0 se ResourceDictionary značky nevyžadují. Místo toho ResourceDictionary je objekt vytvořen automaticky a můžete vkládat prostředky přímo mezi Resources značky elementu vlastnosti.

Využívání prostředků v jazyce XAML

Každý prostředek má klíč, který je zadán pomocí x:Key atributu, který se z něj stal klíčem slovníku ResourceDictionary . Klíč se používá k odkazování na prostředek z ResourceDictionary s StaticResourceDynamicResource příponou značky nebo.

StaticResourceRozšíření značek se podobá DynamicResource příponě značek v tom, že používá klíč slovníku k odkazování na hodnotu ze slovníku prostředků. Nicméně, zatímco StaticResource rozšíření značek provádí vyhledávání v jednom slovníku, DynamicResource přípona 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 aplikuje na vizuální prvek. To umožňuje provádět změny prostředků modulu runtime v aplikaci. Další informace o rozšíření značek naleznete v tématu rozšíření značek XAML.

Následující příklad XAML ukazuje, jak spotřebovávat prostředky a také definovat 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 spotřebovává implicitní styl definovaný ve slovníku prostředků na úrovni aplikace. StackLayoutObjekt spotřebovává PageMargin prostředek definovaný ve slovníku prostředků na úrovni aplikace, zatímco Button objekt spotřebovává implicitní styl definovaný ve StackLayout slovníku prostředků. Výsledkem je vzhled zobrazený na následujících snímcích obrazovky:

spotřebovávajících prostředky ResourceDictionary, které

Důležité

Prostředky, které jsou specifické pro jednu stránku, by neměly být zahrnuté ve slovníku prostředků na úrovni aplikace, protože tyto prostředky se pak analyzují při spuštění aplikace namísto požadavku na stránku. Další informace naleznete v tématu zmenšení velikosti slovníku prostředků aplikace.

Chování vyhledávání prostředků

Následující proces vyhledávání nastane, pokud je prostředek odkazován pomocí StaticResourceDynamicResource rozšíření nebo rozšíření značek:

  • Požadovaný klíč je zkontrolován ve slovníku prostředků, pokud existuje, pro prvek, který nastavuje vlastnost. Pokud se požadovaný klíč najde, jeho hodnota se vrátí a proces vyhledávání se ukončí.
  • Pokud není nalezena shoda, proces vyhledávání prohledává vizuální strom směrem nahoru a kontroluje slovník prostředků jednotlivých nadřazených elementů. Pokud se požadovaný klíč najde, jeho hodnota se vrátí a proces vyhledávání se ukončí. V opačném případě proces pokračuje vzhůru až do dosažení kořenového prvku.
  • Pokud se shoda nenajde v kořenovém elementu, je zkontrolován slovník prostředků na úrovni aplikace.
  • Pokud se shoda stále nenajde, XamlParseException vyvolá se.

Proto když analyzátor XAML nalezne StaticResourceDynamicResource rozšíření nebo, vyhledá odpovídající klíč tím, že se ve vizuálním stromu zaznamená, že se použije první shoda, kterou najde. Pokud toto hledání skončí na stránce a klíč ještě nebyl nalezen, analyzátor XAML prohledá ResourceDictionary připojen k App objektu. Pokud klíč stále není nalezen, je vyvolána výjimka.

Přepsat prostředky

Když prostředky sdílí klíče, budou mít definované prostředky ve vizuálním stromu nižší prioritu než ty, které jsou definované výše. Například nastavení AppBackgroundColor prostředku na AliceBlue úroveň aplikace bude potlačeno prostředkem na úrovni stránky AppBackgroundColor nastaveným na Teal . Podobně se prostředek na úrovni stránky přepíše AppBackgroundColor prostředkem na úrovni ovládacího prvku AppBackgroundColor .

Samostatné slovníky prostředků

Třída odvozená od ResourceDictionary může být také v samostatném souboru XAML. Soubor XAML lze poté sdílet mezi aplikacemi.

Chcete-li vytvořit takový soubor, přidejte do projektu novou položku zobrazení obsahu nebo stránku obsahu (ale ne stránku zobrazení obsahu nebo obsah pouze pomocí souboru C#). Odstraňte soubor kódu na pozadí 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 pojmenovaný ResourceDictionary:

<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 . MyResourceDictionary. XAML lze spotřebovat sloučením do jiného slovníku prostředků.

Ve výchozím nastavení linker odebere samostatné soubory XAML ze sestavení vydaných verzí, pokud je chování linkeru nastaveno na propojení všech sestavení. Chcete-li zajistit, aby samostatné soubory XAML zůstaly v sestavení pro vydání:

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

  2. Nastavte Preserve atribut na úrovni sestavení:

    [assembly:Preserve(AllMembers = true)]
    

Další informace o propojování najdete v tématu propojování aplikací Xamarin. iOS a odkazů na Android.

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čit místní slovníky prostředků

Místní ResourceDictionary soubor lze sloučit do jiného ResourceDictionary vytvořením ResourceDictionary objektu, jehož Xamarin_Forms ResourceDictionary vlastnost _ResourceDictionary_Source data-LINKTYPE = "absolutní cesta" >Source 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 nevytváří instanci MyResourceDictionary třídy. Místo toho odkazuje na soubor XAML. Z tohoto důvodu při nastavení Xamarin_Forms _ResourceDictionary_Source "data-LINKTYPE =" absolutní cesta ">Source vlastnost, soubor kódu na pozadí není vyžadován a x:Class atribut lze odebrat z kořenové značky souboru Source .

Důležité

Vlastnost Xamarin_Forms _ResourceDictionary_Source data-LINKTYPE = "absolutní cesta" >Source lze nastavit pouze z XAML.

Sloučení slovníků prostředků z jiných sestavení

ResourceDictionaryLze také sloučit do jiného přidáním ResourceDictionary do Xamarin_Forms ResourceDictionary _ResourceDictionary_MergedDictionaries "data-LINKTYPE =" absolutní cesta ">MergedDictionaries vlastnosti ResourceDictionary . Tento postup umožňuje sloučit slovníky 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í nastavena na ResourceDictionary, aby měl soubor kódu na pozadí a definoval x:Class atribut v kořenové značce souboru.

Upozornění

ResourceDictionaryTřída také definuje Xamarin_Forms ResourceDictionary vlastnost _ResourceDictionary_MergedWith data-LINKTYPE = "absolutní cesta" >MergedWith . Tato vlastnost se ale už nepoužívá a neměla by se používat.

Následující příklad kódu ukazuje dva slovníky prostředků, které jsou přidány do Xamarin_Forms _ResourceDictionary_MergedDictionaries "data-LINKTYPE =" absolutní cesta ">MergedDictionaries kolekce úrovně stránky ResourceDictionary :

<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 ke slovníku prostředků na úrovni stránky sloučí slovník prostředků ze stejného sestavení a slovník prostředků z externího sestavení. Kromě toho můžete také přidat další ResourceDictionary objekty v rámci Xamarin_Forms ResourceDictionary _ResourceDictionary_MergedDictionaries "data-LINKTYPE =" absolutní cesta ">MergedDictionaries značky prvků vlastností a další prostředky mimo tyto značky.

Důležité

V prvku může být pouze jedna MergedDictionaries značka elementu Property ResourceDictionary , ale v takovém případě můžete do něj umístit tolik ResourceDictionary objektů podle potřeby.

Když sloučený ResourceDictionary prostředek sdílí stejné x:Key hodnoty atributu, Xamarin.Forms používá následující prioritu prostředků:

  1. Prostředky, které jsou 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í, v jakém jsou uvedeny ve MergedDictionaries Vlastnosti.

Poznámka

Vyhledávání slovníků prostředků může být úlohou, která je náročné na výpočetní výkon, 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žívá pouze slovníky prostředků, které jsou pro stránku vhodné.

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