Chargement de XAML au moment de l’exécution dans Xamarin.Forms

Télécharger l’exemple Télécharger l’exemple

L’espace Xamarin.Forms.Xaml de noms comprend deux LoadFromXaml méthodes d’extension qui peuvent être utilisées pour charger et analyser XAML au moment de l’exécution.

Arrière-plan

Lorsqu’une Xamarin.Forms classe XAML est construite, la LoadFromXaml méthode est appelée indirectement. Cela se produit parce que le fichier code-behind d’une classe XAML appelle la InitializeComponent méthode à partir de son constructeur :

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

Lorsque Visual Studio génère un projet contenant un fichier XAML, il analyse le fichier XAML pour générer un fichier de code C# (par exemple, MainPage.xaml.g.cs) qui contient la définition de la InitializeComponent méthode :

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

La InitializeComponent méthode appelle la LoadFromXaml méthode pour extraire le fichier XAML (ou son fichier binaire compilé) de la bibliothèque .NET Standard. Après l’extraction, il initialise tous les objets définis dans le fichier XAML, les connecte tous ensemble dans des relations parent-enfant, attache les gestionnaires d’événements définis dans le code aux événements définis dans le fichier XAML et définit l’arborescence d’objets résultante comme contenu de la page.

Chargement de XAML au moment de l’exécution

Les LoadFromXaml méthodes sont public, et peuvent donc être appelées à partir des Xamarin.Forms applications pour charger et analyser XAML au moment de l’exécution. Cela permet des scénarios tels qu’une application qui télécharge du code XAML à partir d’un service web, crée la vue requise à partir du code XAML et l’affiche dans l’application.

Avertissement

Le chargement de XAML au moment de l’exécution a un coût de performances important et doit généralement être évité.

L’exemple de code suivant illustre une utilisation simple :

using Xamarin.Forms.Xaml;
...

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

Dans cet exemple, une Button instance est créée, avec sa Text valeur de propriété définie à partir du CODE XAML défini dans .string le Button est ensuite ajouté à un StackLayout qui a été défini dans le XAML pour la page.

Notes

Les LoadFromXaml méthodes d’extension permettent de spécifier un argument de type générique. Toutefois, il est rarement nécessaire de spécifier l’argument de type, car il sera déduit du type du instance son fonctionnement sur.

La LoadFromXaml méthode peut être utilisée pour gonfler n’importe quel code XAML, avec l’exemple suivant en gonflant un ContentPage et en y accédant :

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

Accès aux éléments

Le chargement de XAML au moment de l’exécution avec la LoadFromXaml méthode n’autorise pas l’accès fortement typé aux éléments XAML qui ont des noms d’objets runtime spécifiés (à l’aide de x:Name). Toutefois, ces éléments XAML peuvent être récupérés à l’aide de la FindByName méthode , puis accessibles en fonction des besoins :

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

Dans cet exemple, le code XAML d’un ContentPage est gonflé. Ce code XAML inclut un Label nommé monkeyName, qui est récupéré à l’aide de la FindByName méthode , avant que sa Text propriété soit définie.