Laden von XAML zur Laufzeit in Xamarin.Forms

Beispiel herunterladen Das Beispiel herunterladen

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 liegt daran, dass die CodeBehind-Datei für eine XAML-Klasse die InitializeComponent -Methode aus ihrem Konstruktor 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 (z. B. MainPage.xaml.g.cs) zu generieren, 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 es alle in der XAML-Datei definierten Objekte, verbindet sie alle in über-und untergeordneten Beziehungen, fügt im Code definierte Ereignishandler an Ereignisse an, 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 public, und können daher von Xamarin.Forms Anwendungen aufgerufen werden, um zu laden und XAML zur Laufzeit zu analysieren. Dies ermöglicht Szenarien wie eine Anwendung, die XAML aus einem Webdienst herunter lädt, die erforderliche Ansicht aus dem XAML erstellt und in der Anwendung anzeigt.

Warnung

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

Das folgende Codebeispiel zeigt eine einfache Verwendung:

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 instance erstellt, deren Text Eigenschaftswert aus dem xaml-Code festgelegt wird, der stringin definiert ist. Wird Button dann zu einer StackLayout hinzugefügt, die im XAML-Code für die Seite definiert wurde.

Hinweis

Die LoadFromXaml Erweiterungsmethoden ermöglichen die Angabe eines generischen Typarguments. Es ist jedoch selten erforderlich, das Typargument anzugeben, da es aus dem Typ des instance dessen Betrieb abgeleitet wird.

Die LoadFromXaml -Methode kann verwendet werden, um jede XAML-Datei aufzublasen, wobei im folgenden Beispiel ein ContentPage aufbläht und dann dazu navigiert wird:

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 über angegebene Laufzeitobjektnamen verfügen (mit x:Name). Diese XAML-Elemente können jedoch mithilfe der FindByName -Methode abgerufen und dann bei Bedarf darauf zugegriffen 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 ein ContentPage vergrößert. Dieser XAML-Code enthält einen Label namens monkeyName, der mit der FindByName -Methode abgerufen wird, bevor seine Text -Eigenschaft festgelegt wird.