在執行階段載入 XAML
建構 .NET 多平臺應用程式 UI (.NET MAUI) XAML 類別時, LoadFromXaml 會間接呼叫 方法。 這是因為 XAML 類別的程式代碼後置檔案會從其建構函式呼叫 InitializeComponent
方法:
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
}
建置包含 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。 方法 LoadFromXaml 為 public
,因此可以從 .NET MAUI 應用程式呼叫,以在運行時間載入和剖析 XAML。 這可讓應用程式從 Web 服務下載 XAML、從 XAML 建立必要的檢視,以及在應用程式中顯示它等案例。
警告
在運行時間載入 XAML 具有顯著的效能成本,而且通常應該避免。
警告
在運行時間載入 XAML 並不安全,不應與完整修剪或 NativeAOT 搭配使用。 它可藉由批注所有可在運行時間使用 DynamicallyAccessedMembers
屬性或 DynamicDependency
屬性載入的類型來設定安全。 不過,這很容易出錯,不建議這麼做。 此外,在運行時間載入 XAML 具有顯著的效能成本。 如需詳細資訊,請參閱修剪 .NET MAUI 應用程式和原生 AOT 部署。
下列程式代碼範例顯示簡單的用法:
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);
存取元素
使用 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
屬性。