Condividi tramite


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 publice 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à.