Freigeben über


Laden von XAML zur Laufzeit in Xamarin.Forms

Der Xamarin.Forms.Xaml Namespace enthält zwei LoadFromXaml Erweiterungsmethoden, die zum Laden und Analysieren von XAML zur Laufzeit verwendet werden können.

Hintergrund

Wenn eine Xamarin.Forms XAML-Klasse erstellt wird, wird die LoadFromXaml Methode indirekt 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 Visual Studio ein Projekt erstellt, das eine XAML-Datei enthält, analysiert es die XAML-Datei, um eine C#-Codedatei zu generieren (z . B. MainPage.xaml.g.cs), die die Definition der InitializeComponent Methode enthält:

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

Die InitializeComponent Methode ruft die LoadFromXaml Methode auf, um die XAML-Datei (oder die kompilierte Binärdatei) aus der .NET Standard-Bibliothek zu extrahieren. Nach der Extraktion initialisiert sie alle in der XAML-Datei definierten Objekte, verbindet sie alle in Beziehungen zwischen übergeordneten und untergeordneten Elementen, fügt Ereignishandler an, die im Code definiert sind, an Ereignisse, die in der XAML-Datei festgelegt sind, und legt die resultierende Struktur von Objekten als Inhalt der Seite fest.

Laden von XAML zur Laufzeit

Die LoadFromXaml Methoden sind publicund können daher von Xamarin.Forms Anwendungen zum Laden aufgerufen und XAML zur Laufzeit analysiert werden. 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 Anwendung.

Warnung

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

Das folgende Codebeispiel veranschaulicht eine einfache Einsatzmöglichkeit:

using Xamarin.Forms.Xaml;
...

string navigationButtonXAML = "<Button Text=\"Navigate\" />";
Button navigationButton = new Button().LoadFromXaml(navigationButtonXAML);
...
_stackLayout.Children.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 erforderlich, das Typargument anzugeben, da es vom Typ der Instanz abgeleitet wird, auf deren Betrieb sie ausgeführt 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:

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

Zugreifen auf Elemente

Das Laden von XAML zur Laufzeit mit der LoadFromXaml Methode ermöglicht keinen stark typisierten Zugriff auf die XAML-Elemente, die angegebene Laufzeitobjektnamen (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://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";
...

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.