Share via


在執行階段載入 XAML

建構 .NET 多平臺應用程式 UI (.NET MAUI) XAML 類別時, LoadFromXaml 會間接呼叫 方法。 這是因為 XAML 類別的程式代碼後置檔案會從其建構函式呼叫 InitializeComponent 方法:

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

當 Visual Studio 建置包含 XAML 檔案的專案時,來源產生器會產生新的 C# 來源,其中包含 方法的定義 InitializeComponent ,並將其新增至編譯物件。 下列範例顯示 類別的產生 InitializeComponent 方法 MainPage

private void InitializeComponent()
{
    global::Microsoft.Maui.Controls.Xaml.Extensions.LoadFromXaml(this, typeof(MainPage));
    ...
}

方法 InitializeComponent 會呼叫 LoadFromXaml 方法,從應用程式套件擷取 XAML 編譯的二進位檔(或其檔案)。 擷取之後,它會初始化 XAML 中定義的所有物件、將它們全部連接在父子關聯性中、將程式代碼中定義的事件處理程式附加至 XAML 檔案中設定的事件,並將對象的結果樹狀結構設定為頁面的內容。

在執行階段載入 XAML

Extensions命名空間中的 Microsoft.Maui.Controls.Xaml 類別包含LoadFromXaml擴充方法,可用來在運行時間載入和剖析 XAML。 方法 LoadFromXamlpublic,因此可以從 .NET MAUI 應用程式呼叫,以在運行時間載入和剖析 XAML。 這可讓應用程式從 Web 服務下載 XAML、從 XAML 建立必要的檢視,以及在應用程式中顯示它等案例。

警告

在運行時間載入 XAML 具有顯著的效能成本,而且通常應該避免。

下列程式代碼範例顯示簡單的用法:

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

在此範例中,Button會建立 實例,並從 中string定義的 XAML 設定其Text屬性值。 接著,會將 Button 新增至 StackLayout 已在頁面 XAML 中定義的 。

注意

擴充 LoadFromXaml 方法允許指定泛型型別自變數。 不過,很少需要指定類型自變數,因為它會從其運作的實例類型推斷。

LoadFromXaml方法可用來擴充任何 XAML,下列範例會擴充 ContentPage ,然後流覽至它:

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

Access 元素

使用 LoadFromXaml 方法在運行時間載入 XAML 不允許強型別存取具有指定運行時間物件名稱的 XAML 元素(使用 x:Name)。 不過,您可以使用 方法來擷取 FindByName 這些 XAML 元素,然後視需要存取:

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

在此範例中,會擴充 的 ContentPage XAML。 此 XAML 包含 Label 名為 的 ,此名稱 monkeyName是使用 FindByName 方法擷取,然後才設定其 Text 屬性。