在執行階段載入 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。 方法 LoadFromXaml
為 public
,因此可以從 .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
屬性。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應