Laden von XAML zur Laufzeit in xamarin. FormsLoading XAML at Runtime in Xamarin.Forms

Beispiel herunterladen Das Beispiel herunterladenDownload Sample Download the sample

Der Xamarin.Forms.Xaml -Namespace enthält zwei LoadFromXaml Erweiterungs Methoden, die zum Laden und Analysieren von XAML zur Laufzeit verwendet werden können.The Xamarin.Forms.Xaml namespace includes two LoadFromXaml extension methods that can be used to load, and parse XAML at runtime.

HintergrundBackground

Wenn eine xamarin. Forms-XAML-Klasse erstellt wird, wird die LoadFromXaml -Methode indirekt aufgerufen.When a Xamarin.Forms XAML class is constructed, the LoadFromXaml method is indirectly called. Dies liegt daran, dass die Code-Behind-Datei für eine XAML-Klasse die InitializeComponent-Methode von Ihrem Konstruktor aufruft:This occurs because the code-behind file for a XAML class calls the InitializeComponent method from its constructor:

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

Wenn Visual Studio ein Projekt erstellt, das eine XAML-Datei enthält, wird die XAML-Datei analysiert C# , um eine Codedatei (z. b. MainPage.XAML.g.cs) zu generieren, die die Definition der InitializeComponent Methode enthält:When Visual Studio builds a project containing a XAML file, it parses the XAML file to generate a C# code file (for example, MainPage.xaml.g.cs) that contains the definition of the InitializeComponent method:

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.The InitializeComponent method calls the LoadFromXaml method to extract the XAML file (or its compiled binary) from the .NET Standard library. Nach dem Extrahieren werden alle in der XAML-Datei definierten Objekte initialisiert, alle in über-/Unterordnungsbeziehungen miteinander verknüpft, im Code definierte Ereignishandler an in der XAML-Datei festgelegte Ereignisse angefügt und die resultierende Struktur von Objekten als Inhalt des s.After extraction, it initializes all of the objects defined in the XAML file, connects them all together in parent-child relationships, attaches event handlers defined in code to events set in the XAML file, and sets the resultant tree of objects as the content of the page.

Laden von XAML zur LaufzeitLoading XAML at runtime

Die LoadFromXaml Methoden sind publicund können daher von xamarin. Forms-Anwendungen aufgerufen werden, um XAML zur Laufzeit zu laden und zu analysieren.The LoadFromXaml methods are public, and therefore can be called from Xamarin.Forms applications to load, and parse XAML at runtime. Dies ermöglicht Szenarien wie z. b. eine Anwendung, die XAML von einem Webdienst herunterlädt, die erforderliche Ansicht aus dem XAML erstellt und in der Anwendung anzeigt.This permits scenarios such as an application downloading XAML from a web service, creating the required view from the XAML, and displaying it in the application.

Warnung

Das Laden von XAML zur Laufzeit hat einen erheblichen Leistungs Aufwand und sollte im allgemeinen vermieden werden.Loading XAML at runtime has a significant performance cost, and generally should be avoided.

Das folgende Codebeispiel zeigt eine einfache Verwendung:The following code example shows a simple usage:

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 -Eigenschafts Wert aus der im stringdefinierten XAML festgelegt wird.In this example, a Button instance is created, with its Text property value being set from the XAML defined in the string. Der Button wird dann zu einer StackLayout hinzugefügt, die im XAML für die Seite definiert wurde.The Button is then added to a StackLayout that has been defined in the XAML for the page.

Hinweis

Mit den LoadFromXaml -Erweiterungs Methoden kann ein generisches Typargument angegeben werden.The LoadFromXaml extension methods allow a generic type argument to be specified. Es ist jedoch nur selten notwendig, das Typargument anzugeben, da es vom Typ der Instanz abgeleitet wird, auf der es sich befindet.However, it's rarely necessary to specify the type argument, as it will be inferred from the type of the instance its operating on.

Die LoadFromXaml -Methode kann verwendet werden, um beliebige XAML-Code aufzufüllen. im folgenden Beispiel wird ein ContentPage vergrößert und dann zu diesem navigiert:The LoadFromXaml method can be used to inflate any XAML, with the following example inflating a ContentPage and then navigating to it:

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 ElementeAccessing elements

Das Laden von XAML zur Laufzeit mit der LoadFromXaml -Methode ermöglicht keinen stark typisierten Zugriff auf die XAML-Elemente, die über die Namen der Lauf Zeit Objekte verfügen (mit x:Name).Loading XAML at runtime with the LoadFromXaml method does not permit strongly-typed access to the XAML elements that have specified runtime object names (using x:Name). Diese XAML-Elemente können jedoch mit der FindByName -Methode abgerufen und dann nach Bedarf aufgerufen werden:However, these XAML elements can be retrieved using the FindByName method, and then accessed as required:

// 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 aufgeblasen.In this example, the XAML for a ContentPage is inflated. Dieser XAML-Code enthält eine Label mit dem Namen monkeyName, die mit der FindByName -Methode abgerufen wird, bevor die zugehörige Text -Eigenschaft festgelegt wird.This XAML includes a Label named monkeyName, which is retrieved using the FindByName method, before its Text property is set.