Charger XAML lors de l’exécution
Lorsqu’une classe XAML .NET MAUI (.NET Multi-platform App UI) est construite, une méthode LoadFromXaml est appelée indirectement. Cela se produit parce que le fichier code-behind d’une classe XAML appelle la méthode InitializeComponent
à partir de son constructeur :
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
}
Lorsqu’un projet contenant un fichier XAML est généré, un générateur source génère une nouvelle source C# qui contient la définition de la InitializeComponent
méthode et l’ajoute à l’objet de compilation. L’exemple suivant illustre la méthode InitializeComponent
générée pour la classe MainPage
:
private void InitializeComponent()
{
global::Microsoft.Maui.Controls.Xaml.Extensions.LoadFromXaml(this, typeof(MainPage));
...
}
La méthode InitializeComponent
appelle la méthode LoadFromXaml pour extraire le fichier binaire compilé XAML (ou son fichier) à partir du package d’application. Après l’extraction, il initialise tous les objets définis dans le XAML, les connecte tous ensemble dans les relations parent-enfant, attache des gestionnaires d’événements définis dans le code aux événements définis dans le fichier XAML et définit l’arborescence résultante des objets comme contenu de la page.
Charger XAML lors de l’exécution
La classe Extensions
dans l’espace de noms Microsoft.Maui.Controls.Xaml
comprend des méthodes d’extension LoadFromXaml qui peuvent être utilisées pour charger et analyser XAML au moment de l’exécution. Les méthodes LoadFromXaml sont public
et peuvent donc être appelées à partir d’applications .NET MAUI pour charger et analyser XAML au moment de l’exécution. Cela permet d’avoir des scénarios tels qu’une application qui télécharge XAML à partir d’un service web, la création de la vue requise à partir de XAML et son affichage dans l’application.
Avertissement
Le chargement de XAML au moment de l’exécution a un coût important sur les performances et doit généralement être évité.
Avertissement
Le chargement du code XAML au moment de l’exécution n’est pas sécurisé et ne doit pas être utilisé avec le découpage complet ou NativeAOT. Elle peut être rendue sécurisée en annotant tous les types qui peuvent être chargés au moment de l’exécution avec l’attribut DynamicallyAccessedMembers
ou l’attribut DynamicDependency
. Toutefois, cela est très sujette à des erreurs et n’est pas recommandé. En outre, le chargement de XAML au moment de l’exécution a un coût de performances significatif. Pour plus d’informations, consultez Trim a .NET MAUI app and Native AOT deployment.
L’exemple de code suivant montre une utilisation simple :
string navigationButtonXAML = "<Button Text=\"Navigate\" />";
Button navigationButton = new Button().LoadFromXaml(navigationButtonXAML);
...
stackLayout.Add(navigationButton);
Dans cet exemple, une instance Button est créée avec sa valeur de propriété Text
définie à partir du XAML défini dans string
. Le Button est ensuite ajouté à un StackLayout qui a été défini dans le XAML de la page.
Remarque
Les méthodes d’extension LoadFromXaml permettent à un argument de type générique d’être spécifié. Toutefois, il est rarement nécessaire de spécifier l’argument de type, car il sera déduit du type de l’instance sur laquelle il fonctionne.
La méthode LoadFromXaml peut être utilisée pour remplir (« inflate ») n’importe quel XAML, avec l’exemple suivant qui remplit un ContentPage, puis y accède :
// 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);
Accéder aux éléments
Le chargement de XAML au moment de l’exécution avec la méthode LoadFromXaml n’autorise pas l’accès fortement typé aux éléments XAML qui ont des noms d’objets d’exécution spécifiés (en utilisant x:Name
). Toutefois, ces éléments XAML peuvent être récupérés à l’aide de la méthode FindByName
, puis accessibles si besoin :
// 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";
Dans cet exemple, le XAML d’un ContentPage est rempli. Ce XAML inclut un Label appelé monkeyName
, qui est récupéré à l’aide de la méthode FindByName
avant que sa propriété Text
ne soit définie.