Caricare XAML in fase di esecuzione
Quando viene costruita una classe XAML dell'interfaccia utente app multipiattaforma .NET (.NET MAUI), viene chiamato indirettamente un LoadFromXaml metodo. Ciò si verifica perché il file code-behind per una classe XAML chiama il InitializeComponent
metodo dal relativo costruttore:
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
}
Quando viene compilato un progetto contenente un file XAML, un generatore di origine genera una nuova origine C# contenente la definizione del InitializeComponent
metodo e la aggiunge all'oggetto di compilazione. L'esempio seguente illustra il metodo generato InitializeComponent
per la MainPage
classe :
private void InitializeComponent()
{
global::Microsoft.Maui.Controls.Xaml.Extensions.LoadFromXaml(this, typeof(MainPage));
...
}
Il InitializeComponent
metodo chiama il LoadFromXaml metodo per estrarre il file binario compilato XAML (o il relativo file) dal pacchetto dell'app. Dopo l'estrazione, inizializza tutti gli oggetti definiti nel codice XAML, li collega tutti insieme nelle relazioni padre-figlio, associa i gestori eventi definiti nel codice agli eventi impostati nel file XAML e imposta l'albero risultante degli oggetti come contenuto della pagina.
Caricare XAML in fase di esecuzione
La Extensions
classe, nello spazio dei Microsoft.Maui.Controls.Xaml
nomi, include LoadFromXaml metodi di estensione che possono essere usati per caricare e analizzare XAML in fase di esecuzione. I LoadFromXaml metodi sono public
e pertanto possono essere chiamati dalle applicazioni MAUI .NET per caricare e analizzare XAML in fase di esecuzione. In questo modo è possibile abilitare scenari come il download di XAML da un servizio Web, la creazione della visualizzazione richiesta dal codice XAML e la visualizzazione nell'app.
Avviso
Il caricamento di XAML in fase di esecuzione ha un costo significativo delle prestazioni e in genere deve essere evitato.
Avviso
Il caricamento di XAML in fase di esecuzione non è sicuro e non deve essere usato con taglio completo o NativeAOT. Può essere resa sicura annotando tutti i tipi che possono essere caricati in fase di esecuzione con l'attributo o l'attributo DynamicallyAccessedMembers
DynamicDependency
. Tuttavia, questo è molto soggetto a errori e non è consigliato. Inoltre, il caricamento di XAML in fase di esecuzione comporta un costo significativo per le prestazioni. Per altre informazioni, vedere Trim a .NET MAUI app and Native AOT deployment (Trim a .NET MAUI app and Native AOT deployment).
L'esempio di codice seguente illustra un utilizzo semplice:
string navigationButtonXAML = "<Button Text=\"Navigate\" />";
Button navigationButton = new Button().LoadFromXaml(navigationButtonXAML);
...
stackLayout.Add(navigationButton);
In questo esempio viene creata un'istanza Button di , con il relativo Text
valore della proprietà impostato dal codice XAML definito in string
. Viene Button quindi aggiunto a un StackLayout oggetto definito nel codice XAML per la pagina.
Nota
I LoadFromXaml metodi di estensione consentono di specificare un argomento di tipo generico. Tuttavia, raramente è necessario specificare l'argomento di tipo, perché verrà dedotto dal tipo dell'istanza su cui opera.
Il LoadFromXaml metodo può essere usato per gonfiare qualsiasi XAML, con l'esempio seguente che gonfia un ContentPage oggetto e quindi passa a esso:
// 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);
Elementi di accesso
Il caricamento di XAML in fase di esecuzione con il LoadFromXaml metodo non consente l'accesso fortemente tipizzato agli elementi XAML che hanno specificato nomi di oggetti di runtime (usando x:Name
). Tuttavia, questi elementi XAML possono essere recuperati usando il FindByName
metodo e quindi accedervi in base alle esigenze:
// 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";
In questo esempio il codice XAML per un ContentPage oggetto viene gonfiato. Questo codice XAML include un Label oggetto denominato monkeyName
, recuperato usando il metodo , prima che FindByName
venga impostata la relativa Text
proprietà.