Sdílet prostřednictvím


Využívání rozšíření značek XAML

Procházet ukázku. Procházet ukázku

Rozšíření značek XAML pro více platforem .NET (.NET MAUI) pomáhají vylepšit výkon a flexibilitu XAML tím, že umožňují nastavit atributy elementů z různých zdrojů.

Například obvykle nastavíte vlastnost ColorBoxView takto:

<BoxView Color="Blue" />

Můžete ale raději nastavit atribut Color z hodnoty uložené ve slovníku prostředků nebo z hodnoty statické vlastnosti třídy, kterou jste vytvořili, nebo z vlastnosti typu Color jiného prvku na stránce nebo vytvořeného ze samostatných hodnot odstínů, sytosti a světelnosti. Všechny tyto možnosti jsou možné pomocí rozšíření značek XAML.

Rozšíření zápisu je jiný způsob, jak vyjádřit atribut prvku. Značkovací rozšíření XAML pro .NET MAUI lze obvykle rozeznat podle hodnoty atributu uzavřené ve složených závorkách:

<BoxView Color="{StaticResource themeColor}" />

Jakákoli hodnota atributu ve složených závorkách je vždy značkovací rozšíření XAML. Na rozšíření značek XAML se ale dá odkazovat i bez použití složených závorek.

Poznámka

Několik rozšíření značek XAML je součástí specifikace XAML 2009. Ty se zobrazují v souborech XAML s obvyklou předponou oboru názvů x a běžně se na ně odkazuje s touto předponou.

Kromě rozšíření značek probíraných v tomto článku jsou následující rozšíření značek zahrnuta v .NET MAUI a popsána v dalších článcích:

x:Static markup extension

Rozšíření x:Static značek podporuje třída StaticExtension. Třída má jednu vlastnost s názvem Member typu string, kterou jste nastavili na název veřejné konstanty, statické vlastnosti, statického pole nebo člen výčtu.

Jedním ze způsobů, jak použít x:Static, je nejprve definovat třídu s některými konstantami nebo statickými proměnnými, například s touto AppConstants třídou:

static class AppConstants
{
    public static double NormalFontSize = 18;
}

Následující XAML ukazuje nejrozsáhlejší způsob vytvoření instance třídy StaticExtension mezi značkami elementu vlastnosti Label.FontSize:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:sys="clr-namespace:System;assembly=netstandard"
             xmlns:local="clr-namespace:MarkupExtensions"
             x:Class="MarkupExtensions.StaticDemoPage"
             Title="x:Static Demo">
    <StackLayout Margin="10, 0">
        <Label Text="Label No. 1">
            <Label.FontSize>
                <x:StaticExtension Member="local:AppConstants.NormalFontSize" />
            </Label.FontSize>
        </Label>
        ···
    </StackLayout>
</ContentPage>

Analyzátor XAML také umožňuje, aby třída StaticExtension byla zkrácena jako x:Static:

<Label Text="Label No. 2">
    <Label.FontSize>
        <x:Static Member="local:AppConstants.NormalFontSize" />
    </Label.FontSize>
</Label>

Tuto syntaxi lze dále zjednodušit umístěním třídy StaticExtension a členového nastavení do složených závorek. Výsledný výraz se nastaví přímo na atribut FontSize:

<Label Text="Label No. 3"
       FontSize="{x:StaticExtension Member=local:AppConstants.NormalFontSize}" />

V tomto příkladu žádné uvozovky uvnitř složených závorek. Vlastnost MemberStaticExtension již není atributem XML. Je to naopak součást výrazu pro rozšíření značky.

Stejně jako můžete zkrátit x:StaticExtension na x:Static, když jej použijete jako prvek objektu, můžete ho také zkrátit ve výrazu ve složených závorkách:

<Label Text="Label No. 4"
       FontSize="{x:Static Member=local:AppConstants.NormalFontSize}" />

Třída StaticExtension má atribut ContentProperty odkazující na vlastnost Member, která označuje tuto vlastnost jako výchozí vlastnost obsahu třídy. U značkovacích rozšíření XAML vyjádřených složenými závorkami můžete odstranit část Member= z výrazu.

<Label Text="Label No. 5"
       FontSize="{x:Static local:AppConstants.NormalFontSize}" />

Toto je nejběžnější forma rozšíření x:Static značek.

Kořenová značka příkladu XAML obsahuje také deklaraci oboru názvů XML pro obor názvů .NET System. To umožňuje nastavit velikost písma Label na statické pole Math.PI. Výsledkem je poměrně malý text, takže vlastnost Scale je nastavená na Math.E:

<Label Text="&#x03C0; &#x00D7; E sized text"
       FontSize="{x:Static sys:Math.PI}"
       Scale="{x:Static sys:Math.E}"
       HorizontalOptions="Center" />

Následující snímek obrazovky ukazuje výstup XAML:

x:Static demo.

x:Reference – rozšíření značek

Rozšíření značek x:Reference podporuje třída ReferenceExtension. Třída má jednu vlastnost s názvem Name typu string, kterou jste nastavili na název prvku na stránce, který má název s x:Name. Tato vlastnost Name je vlastnost obsahu ReferenceExtension, takže Name= není vyžadován, pokud se x:Reference objeví ve složených závorkách. Rozšíření x:Reference se používá výhradně s datovými vazbami. Další informace o datových vazbách naleznete v tématu Datové vazby.

Následující příklad XAML ukazuje dvě použití x:Reference s datovými vazbami, první, kde se používá k nastavení Source vlastnosti objektu Binding a druhé, kde se používá k nastavení vlastnosti BindingContext pro dvě datové vazby:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MarkupExtensions.ReferenceDemoPage"
             x:Name="page"
             Title="x:Reference Demo">    
    <StackLayout Margin="10, 0">        
        <Label x:DataType="ContentPage"
               Text="{Binding Source={x:Reference page},
                              StringFormat='The type of this page is {0}'}"
               FontSize="18"
               VerticalOptions="Center"
               HorizontalTextAlignment="Center" />
        <Slider x:Name="slider"
                Maximum="360"
                VerticalOptions="Center" />
        <Label x:DataType="Slider"
               BindingContext="{x:Reference slider}"
               Text="{Binding Value, StringFormat='{0:F0}&#x00B0; rotation'}"
               Rotation="{Binding Value}"
               FontSize="24"
               HorizontalOptions="Center"
               VerticalOptions="Center" />        
    </StackLayout>
</ContentPage>

V tomto příkladu oba výrazy x:Reference používají zkrácenou verzi názvu třídy ReferenceExtension a eliminují Name= část výrazu. V prvním příkladu je rozšíření značek x:Reference vloženo do rozšíření značek Binding a vlastnosti Source a StringFormat jsou odděleny čárkami.

Následující snímek obrazovky ukazuje výstup XAML:

x:Reference demo.

x:Type – rozšíření značek

Rozšíření značek x:Type je v XAML ekvivalentem klíčového slova typeof jazyka C#. Podporuje ji třída TypeExtension, která definuje vlastnost s názvem TypeName typu string, která by měla být nastavena na název třídy nebo struktury. Rozšíření x:Type značek vrátí objekt Type dané třídy nebo struktury. TypeName je vlastnost obsahu TypeExtension, takže TypeName= není vyžadována, pokud se x:Type zobrazí se složenými závorkami.

Rozšíření značek x:Type se běžně používá s rozšířením značek x:Array. Další informace najdete v tématu rozšíření značek x:Array.

Následující příklad XAML ukazuje použití x:Type značkovacího rozšíření k instanciaci objektů .NET MAUI a jejich přidání do StackLayout. XAML se skládá ze tří Button prvků s jejich Command vlastnostmi nastavenými na Binding a s CommandParameter vlastnostmi nastavenými na typy tří zobrazení .NET MAUI:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:MarkupExtensions"
             x:Class="MarkupExtensions.TypeDemoPage"
             Title="x:Type Demo"
             x:DataType="local:TypeDemoPage">
    <StackLayout x:Name="stackLayout"
                 Padding="10, 0">
        <Button Text="Create a Slider"
                HorizontalOptions="Center"
                VerticalOptions="Center"
                Command="{Binding CreateCommand}"
                CommandParameter="{x:Type Slider}" />
        <Button Text="Create a Stepper"
                HorizontalOptions="Center"
                VerticalOptions="Center"
                Command="{Binding CreateCommand}"
                CommandParameter="{x:Type Stepper}" />
        <Button Text="Create a Switch"
                HorizontalOptions="Center"
                VerticalOptions="Center"
                Command="{Binding CreateCommand}"
                CommandParameter="{x:Type Switch}" />
    </StackLayout>
</ContentPage>

Soubor code-behind definuje a inicializuje vlastnost CreateCommand.

public partial class TypeDemoPage : ContentPage
{
    public ICommand CreateCommand { get; private set; }

    public TypeDemoPage()
    {
        InitializeComponent();

        CreateCommand = new Command<Type>((Type viewType) =>
        {
            View view = (View)Activator.CreateInstance(viewType);
            view.VerticalOptions = LayoutOptions.Center;
            stackLayout.Add(view);
        });

        BindingContext = this;
    }
}

Když se stiskne Button, je vytvořena nová instance argumentu CommandParameter a přidána do StackLayout. Tři Button objekty pak sdílí stránku s dynamicky vytvořenými zobrazeními:

x:Type demo.

Obecné typy lze zadat pomocí rozšíření značkování x:Type tak, že obecné omezení zadáte jako řetězcový argument s předponou v závorkách.

<x:Array Type="{x:Type local:MyType(local:MyObject)}">
    ...
</x:Array>

Lze zadat více argumentů typu jako řetězce s předponami, oddělené čárkou:

<x:Array Type="{x:Type local:MyType(local:MyObject,x:Boolean)}">
    ...
</x:Array>

Další informace o obecných formátech v jazyce XAML naleznete v tématu obecné typy.

x:Array – rozšíření značkování

Rozšíření značkování x:Array umožňuje definovat pole ve značkování. Podporuje ji třída ArrayExtension, která definuje dvě vlastnosti:

  • Type typu Type, který označuje typ prvků v poli. Tato vlastnost by měla být nastavena na rozšíření značkovacího jazyka x:Type.
  • Items typu IList, který představuje kolekci položek samotných. Toto je vlastnost obsahu ArrayExtension.

Rozšíření značek x:Array se nikdy nezobrazuje ve složených závorkách. Místo toho x:Array počáteční a koncové značky odděluje seznam položek.

Následující příklad XAML ukazuje, jak pomocí x:Array přidat položky do ListView nastavením vlastnosti ItemsSource na pole:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MarkupExtensions.ArrayDemoPage"
             Title="x:Array Demo Page">
    <ListView Margin="10">
        <ListView.ItemsSource>
            <x:Array Type="{x:Type Color}">
                <Color>Aqua</Color>
                <Color>Black</Color>
                <Color>Blue</Color>
                <Color>Fuchsia</Color>
                <Color>Gray</Color>
                <Color>Green</Color>
                <Color>Lime</Color>
                <Color>Maroon</Color>
                <Color>Navy</Color>
                <Color>Olive</Color>
                <Color>Pink</Color>
                <Color>Purple</Color>
                <Color>Red</Color>
                <Color>Silver</Color>
                <Color>Teal</Color>
                <Color>White</Color>
                <Color>Yellow</Color>
            </x:Array>
        </ListView.ItemsSource>
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="Color">
                <ViewCell>
                    <BoxView Color="{Binding}"
                             Margin="3" />
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</ContentPage>  

V tomto příkladu ViewCell vytvoří jednoduchou BoxView pro každou položku barvy:

x:Array demo.

Poznámka

Při definování polí běžných typů, jako jsou řetězce nebo čísla, použijte značky primitiv jazyka XAML uvedené v Předávat argumenty.

x:Null – rozšíření značek

Rozšíření značek x:Null podporuje třída NullExtension. Nemá žádné vlastnosti a je to jednoduše ekvivalent XAML klíčového slova null jazyka C#.

Následující příklad XAML ukazuje, jak použít rozšíření značek x:Null:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MarkupExtensions.NullDemoPage"
             Title="x:Null Demo">
    <ContentPage.Resources>
        <Style TargetType="Label">
            <Setter Property="FontSize" Value="48" />
            <Setter Property="FontFamily" Value="OpenSansRegular" />
        </Style>
    </ContentPage.Resources>

    <StackLayout Padding="10, 0">
        <Label Text="Text 1" />
        <Label Text="Text 2" />
        <Label Text="Text 3"
               FontFamily="{x:Null}" />
        <Label Text="Text 4" />
        <Label Text="Text 5" />
    </StackLayout>
</ContentPage>      

V tomto příkladu je implicitní Style definován pro Label a zahrnuje Setter, který nastavuje vlastnost FontFamily na konkrétní písmo. Třetí Label se však vyhýbá použití písma definovaného v implicitním stylu nastavením jeho FontFamily na x:Null.

x:Null demo.

Rozšíření značek DataTemplate

Rozšíření značky DataTemplate umožňuje převést typ na DataTemplate. Je podporováno třídou DataTemplateExtension, která definuje vlastnost TypeName typu string, jež je nastavena na název typu, který se má převést na DataTemplate. Vlastnost TypeName je vlastnost obsahu DataTemplateExtension. Proto u výrazů značek XAML vyjádřených složenými závorkami můžete eliminovat TypeName= části výrazu.

Poznámka

Analyzátor XAML umožňuje, aby byla třída DataTemplateExtension zkrácena na DataTemplate.

Typické použití tohoto rozšíření značek je v aplikaci Shell, jak je znázorněno v následujícím příkladu:

<ShellContent Title="Monkeys"
              Icon="monkey.png"
              ContentTemplate="{DataTemplate views:MonkeysPage}" />

V tomto příkladu se MonkeysPage převede z ContentPage na DataTemplate, který je nastaven jako hodnota vlastnosti ShellContent.ContentTemplate. Tím se zajistí, že se MonkeysPage vytvoří pouze v případě, že dojde k navigaci na stránku, a ne při spuštění aplikace.

Další informace o aplikacích Shell najdete v tématu Shell.