Freigeben über


Laden von XAML zur Laufzeit

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

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

Wenn ein Projekt mit einer XAML-Datei erstellt wird, generiert ein Quellgenerator eine neue C#-Quelle, die die Definition der InitializeComponent Methode enthält, und fügt es dem Kompilierungsobjekt hinzu. Das folgende Beispiel zeigt die generierte InitializeComponent-Methode für die MainPage-Klasse:

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

Die InitializeComponent-Methode ruft die LoadFromXaml-Methode auf, um die kompilierte XAML-Binärdatei (oder ihre Datei) aus dem App-Paket zu extrahieren. Nach der Extraktion werden alle in der XAML-Datei definierten Objekte initialisiert, in Form von Beziehungen zwischen übergeordneten und untergeordneten Objekten miteinander verbunden, im Code definierte Ereignishandler an die in der XAML-Datei festgelegten Ereignisse angehängt und die daraus resultierende Objektstruktur als Inhalt der Seite festgelegt.

Laden von XAML zur Laufzeit

Die Extensions-Klasse im Namespace Microsoft.Maui.Controls.Xaml 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 parsen. Dies ermöglicht Szenarien wie das Herunterladen von XAML von einem Webdienst, das Erstellen der gewünschten Ansicht aus dem XAML-Code und die Anzeige in der App.

Warnung

Das Laden von XAML-Code zur Laufzeit hat erhebliche Leistungseinbußen zur Folge und sollte daher generell vermieden werden.

Warnung

Das Laden von XAML zur Laufzeit ist nicht sicher und sollte nicht mit vollständiger Kürzung oder NativeAOT verwendet werden. Sie kann durch Kommentieren aller Typen, die zur Laufzeit mit dem DynamicallyAccessedMembers Attribut oder dem DynamicDependency Attribut geladen werden können, sicher gekürzt werden. Dies ist jedoch sehr fehleranfällig und wird nicht empfohlen. Darüber hinaus hat das Laden von XAML zur Laufzeit erhebliche Leistungskosten. Weitere Informationen finden Sie unter Trim a .NET MAUI app and Native AOT deployment.

Das folgende Codebeispiel veranschaulicht eine einfache Einsatzmöglichkeit:

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

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

Hinweis

Die LoadFromXaml-Erweiterungsmethoden erlauben die Angabe eines generischen Typarguments. Es ist jedoch selten notwendig, das Typargument anzugeben, da es aus dem Typ der Instanz abgeleitet wird, für die es verwendet wird.

Die LoadFromXaml-Methode kann zum Erweitern von beliebigem XAML-Code verwendet werden. Im folgenden Beispiel wird eine ContentPage erweitert und dann zu ihr 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-Code zur Laufzeit mit der LoadFromXaml-Methode erlaubt keinen stark typisierten Zugriff auf die XAML-Elemente, für die Laufzeit-Objektnamen festgelegt wurden (mit x:Name). Diese XAML-Elemente können jedoch mit 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 erweitert. Dieser XAML-Code enthält ein Label namens monkeyName, das mit der FindByName-Methode abgerufen wird, bevor seine Text-Eigenschaft festgelegt wird.