Načítání XAML za běhu v Xamarin.Forms

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

Xamarin.Forms.XamlObor názvů obsahuje dvě LoadFromXaml metody rozšíření, které lze použít k načtení a analýze XAML za běhu.

Pozadí

Když Xamarin.Forms je vytvořena třída jazyka XAML, LoadFromXaml Metoda je nepřímo volána. K tomu dochází, protože soubor kódu na pozadí třídy jazyka XAML volá InitializeComponent metodu z jejího konstruktoru:

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }
}

když Visual Studio vytvoří projekt obsahující soubor xaml, analyzuje soubor xaml a vygeneruje soubor kódu jazyka C# (například MainPage. XAML. g. cs), který obsahuje definici metody:

private void InitializeComponent()
{
    global::Xamarin.Forms.Xaml.Extensions.LoadFromXaml(this, typeof(MainPage));
    ...
}

InitializeComponentMetoda volá LoadFromXaml metodu pro extrakci souboru XAML (nebo jeho zkompilovaného binárního souboru) z knihovny .NET Standard. Po extrakci inicializuje všechny objekty, které jsou definovány v souboru XAML, spojuje je dohromady v rámci vztahů nadřazenosti a podřízenosti, připojí obslužné rutiny události definované v kódu k událostem nastaveným v souboru XAML a nastaví výsledný strom objektů jako obsah stránky.

Načítání XAML za běhu

LoadFromXamlMetody jsou public a proto mohou být volány z Xamarin.Forms aplikací k načtení a analyzovat XAML za běhu. To umožňuje scénářům, jako je například aplikace stahovat XAML z webové služby, vytvořit požadované zobrazení z XAML a zobrazit ho v aplikaci.

Upozornění

Načítání XAML za běhu má významné náklady na výkon a obecně by se mělo vyhnout.

Následující příklad kódu ukazuje jednoduché použití:

using Xamarin.Forms.Xaml;
...

string navigationButtonXAML = "<Button Text=\"Navigate\" />";
Button navigationButton = new Button().LoadFromXaml(navigationButtonXAML);
...
_stackLayout.Children.Add(navigationButton);

V tomto příkladu Button je vytvořena instance s jeho Xamarin_Forms Button _Button_Text "data-LINKTYPE =" absolutní cesta ">Text hodnota vlastnosti, která je nastavena v jazyce XAML definovaného v string . ButtonJe pak přidáno do StackLayout , který byl definován v jazyce XAML pro stránku.

Poznámka

LoadFromXamlRozšiřující metody umožňují zadat argument obecného typu. Nicméně není nutné určit argument typu, protože bude odvozen z typu instance, na které je spuštěn.

LoadFromXamlMetoda může být použita pro deflaci libovolného XAML, s následujícím příkladem, který je neplochý ContentPage a následně na něj přejde:

using Xamarin.Forms.Xaml;
...

// See the sample for the full XAML string
string pageXAML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<ContentPage xmlns=\"http://xamarin.com/schemas/2014/forms\"\nxmlns:x=\"http://schemas.microsoft.com/winfx/2009/xaml\"\nx:Class=\"LoadRuntimeXAML.CatalogItemsPage\"\nTitle=\"Catalog Items\">\n</ContentPage>";

ContentPage page = new ContentPage().LoadFromXaml(pageXAML);
await Navigation.PushAsync(page);

Přístup k elementům

Načítání XAML za běhu s LoadFromXaml metodou nepovoluje přístup silně typované k prvkům jazyka XAML, které mají zadané názvy objektů za běhu (pomocí x:Name ). Tyto prvky XAML však lze načíst pomocí FindByName metody a pak podle potřeby použít:

// See the sample for the full XAML string
string pageXAML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<ContentPage xmlns=\"http://xamarin.com/schemas/2014/forms\"\nxmlns:x=\"http://schemas.microsoft.com/winfx/2009/xaml\"\nx:Class=\"LoadRuntimeXAML.CatalogItemsPage\"\nTitle=\"Catalog Items\">\n<StackLayout>\n<Label x:Name=\"monkeyName\"\n />\n</StackLayout>\n</ContentPage>";
ContentPage page = new ContentPage().LoadFromXaml(pageXAML);

Label monkeyLabel = page.FindByName<Label>("monkeyName");
monkeyLabel.Text = "Seated Monkey";
...

V tomto příkladu je XAML pro a ContentPage neplochý. Tento kód XAML obsahuje Label název monkeyName , který je načten pomocí FindByName metody, před jeho Xamarin_Forms Label _Label_Text Text je nastavena vlastnost "data-linktype =" absolutní cesta "> .