Sdílet prostřednictvím


Načtení XAML za běhu

Když je vytvořena třída XAML pro víceplatformní rozhraní aplikace .NET (.NET MAUI), LoadFromXaml metoda se nepřímo volá. K tomu dochází, protože soubor kódu pro třídu XAML volá metodu InitializeComponent z jeho konstruktoru:

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

Při sestavení projektu obsahujícího soubor XAML generuje generátor zdrojů nový zdroj jazyka C#, který obsahuje definici metody a přidá ho InitializeComponent do objektu kompilace. Následující příklad ukazuje vygenerovanou InitializeComponent metodu MainPage pro třídu:

private void InitializeComponent()
{
    global::Microsoft.Maui.Controls.Xaml.Extensions.LoadFromXaml(this, typeof(MainPage));
    ...
}

Metoda InitializeComponent volá metodu LoadFromXaml pro extrahování kompilovaného binárního souboru XAML (nebo jeho souboru) z balíčku aplikace. Po extrakci inicializuje všechny objekty definované v XAML, spojí je všechny v relacích nadřazených a podřízených, připojí obslužné rutiny událostí definované v kódu k událostem nastaveným v souboru XAML a nastaví výsledný strom objektů jako obsah stránky.

Načtení XAML za běhu

Třída Extensions v Microsoft.Maui.Controls.Xaml oboru názvů zahrnuje LoadFromXaml rozšiřující metody, které lze použít k načtení a parsování XAML za běhu. Metody LoadFromXaml jsou public, a proto lze volat z aplikací .NET MAUI pro načtení a parsování XAML za běhu. To umožňuje scénáře, jako je například stažení XAML z webové služby, vytvoření požadovaného zobrazení z XAML a jeho zobrazení v aplikaci.

Upozorňující

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

Upozorňující

Načítání XAML za běhu není bezpečné a nemělo by se používat s úplným oříznutím ani nativním objektem AOT. Můžete ho oříznout tak, že označíte všechny typy, které je možné načíst za běhu pomocí DynamicallyAccessedMembers atributu nebo atributu DynamicDependency . Toto je ale velmi náchylné k chybám a nedoporučuje se. Načítání XAML za běhu má navíc značné náklady na výkon. Další informace najdete v tématu Oříznutí aplikace .NET MAUI a nativního nasazení AOT.

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

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

V tomto příkladu Button se vytvoří instance s hodnotou vlastnosti Text nastavenou z XAML definovaného v souboru string. Potom Button se přidá do objektu StackLayout definovaného v XAML pro stránku.

Poznámka:

Metody LoadFromXaml rozšíření umožňují zadat argument obecného typu. Je však zřídka nutné zadat argument typu, protože bude odvozen z typu instance, na které pracuje.

Tuto LoadFromXaml metodu lze použít k nafouknutí libovolného XAML, přičemž následující příklad nafoukne ContentPage a pak na něj přejde:

// See the sample for the full XAML string
string pageXAML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<ContentPage xmlns=\"http://schemas.microsoft.com/dotnet/2021/maui\"\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řístupové prvky

Načítání XAML za běhu pomocí LoadFromXaml metody neumožňuje přístup k elementům XAML se zadanými názvy objektů modulu runtime (pomocí x:Name). Tyto elementy XAML je však možné načíst pomocí FindByName metody a pak k němu přistupovat podle potřeby:

// See the sample for the full XAML string
string pageXAML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<ContentPage xmlns=\"http://schemas.microsoft.com/dotnet/2021/maui\"\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 akumulační ContentPage . Tento XAML obsahuje pojmenovaný monkeyNameLabel , který je načten pomocí FindByName metody, před jeho Text vlastnost je nastavena.