Laden von XAML zur Laufzeit

Wenn eine .NET Multi-Platform App UI (.NET MAUI)-XAML-Klasse erstellt wird, wird eine LoadFromXaml-Methode indirekt aufgerufen. Dies geschieht, weil die Code-Behind-Datei für eine XAML-Klasse die Methode InitializeComponent von ihrem Konstruktor aus aufruft:

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

Wenn Visual Studio ein Projekt erstellt, das eine XAML-Datei enthält, generiert ein Quellcodegenerator neuen C#-Quellcode, der die Definition der InitializeComponent-Methode enthält, und fügt ihn dem Kompilierungsobjekt hinzu. Das folgende Beispiel zeigt die generierte Methode InitializeComponent für die Klasse MainPage:

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

Die InitializeComponent-Methode ruft die LoadFromXaml-Methode auf, um die XAML-kompilierte Binärdatei (oder ihre Datei) aus dem Anwendungspaket zu extrahieren. Nach der Extraktion werden alle in der XAML-Datei definierten Objekte initialisiert, in Eltern-Kind-Beziehungen miteinander verbunden, im Code definierte Ereignishandler an die in der XAML-Datei festgelegten Ereignisse angehängt und der so entstandene Baum von Objekten als Inhalt der Seite festgelegt.

Laden von XAML zur Laufzeit

Die Extensions-Klasse im Microsoft.Maui.Controls.Xaml-Namespace enthält LoadFromXaml-Erweiterungsmethoden, die zum Laden und Parsen von XAML zur Laufzeit verwendet werden können. Die LoadFromXaml-Methoden sind public und können daher von .NET MAUI-Anwendungen aufgerufen werden, um XAML zur Laufzeit zu laden und zu analysieren. Dies ermöglicht Szenarien wie das Herunterladen von XAML aus einem Webdienst, das Erstellen der erforderlichen Ansicht aus dem XAML und das Anzeigen in der App.

Warnung

Das Laden von XAML zur Laufzeit hat erhebliche Leistungskosten und sollte im Allgemeinen vermieden werden.

Das folgende Codebeispiel zeigt eine einfache Anwendung:

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

In diesem Beispiel wird eine Button-Instanz erstellt, wobei ihr Text-Eigenschaftswert aus dem in der string-Datei definierten XAML-Code festgelegt wird. Der Button wird dann zu einem StackLayout-Element hinzugefügt, das im XAML-Code für die Seite definiert wurde.

Hinweis

Mit den LoadFromXaml-Erweiterungsmethoden kann ein generisches Typargument angegeben werden. Es ist jedoch selten erforderlich, das Typargument anzugeben, da es vom Typ der Instanz abgeleitet wird, auf der sie ausgeführt wird.

Die LoadFromXaml-Methode kann zum Aufblasen von XAML verwendet werden, wobei das folgende Beispiel ein ContentPage aufbläst und dann zu diesem navigiert:

// 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);

Zugreifen auf Elemente

Das Laden von XAML zur Laufzeit mit der LoadFromXaml-Methode lässt keinen stark typierten Zugriff auf die XAML-Elemente zu, die angegebene Laufzeitobjektnamen haben (mit x:Name). Diese XAML-Elemente können jedoch mithilfe der FindByName-Methode abgerufen und dann nach Bedarf aufgerufen werden:

// 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";

In diesem Beispiel wird der XAML-Code für eine ContentPage aufgeblasen. Dieser XAML-Code enthält einen Label benannten monkeyName, der mithilfe der FindByName-Methode abgerufen wird, bevor seine Text-Eigenschaft festgelegt wird.