在運行時間載入 XAML Xamarin.Forms
命名空間 Xamarin.Forms.Xaml
包含兩 LoadFromXaml
個擴充方法,可用來載入,並在運行時間剖析 XAML。
背景
Xamarin.Forms建構 XAML 類別時,LoadFromXaml
會間接呼叫 方法。 這是因為 XAML 類別的程式代碼後置檔案會從其建構函式呼叫 InitializeComponent
方法:
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
}
當 Visual Studio 建置包含 XAML 檔案的專案時,它會剖析 XAML 檔案以產生包含 方法定義的 InitializeComponent
C# 程式代碼檔案(例如,MainPage.xaml.g.cs:
private void InitializeComponent()
{
global::Xamarin.Forms.Xaml.Extensions.LoadFromXaml(this, typeof(MainPage));
...
}
方法 InitializeComponent
會呼叫 LoadFromXaml
方法,從 .NET Standard 連結庫擷取 XAML 檔案(或其編譯的二進位檔)。 擷取之後,它會初始化 XAML 檔案中定義的所有物件、將它們全部連接在父子關聯性中、將程式代碼中定義的事件處理程式附加至 XAML 檔案中設定的事件,並將對象的結果樹狀結構設定為頁面的內容。
在運行時間載入 XAML
方法 LoadFromXaml
為 public
,因此可以從應用程式呼叫 Xamarin.Forms 以載入,並在運行時間剖析 XAML。 這允許從 Web 服務下載 XAML、從 XAML 建立必要檢視,以及在應用程式中顯示 XAML 等案例。
警告
在運行時間載入 XAML 具有顯著的效能成本,而且通常應該避免。
下列程式代碼範例顯示簡單的用法:
using Xamarin.Forms.Xaml;
...
string navigationButtonXAML = "<Button Text=\"Navigate\" />";
Button navigationButton = new Button().LoadFromXaml(navigationButtonXAML);
...
_stackLayout.Children.Add(navigationButton);
在此範例中,Button
會建立 實例,並從 中string
定義的 XAML 設定其Text
屬性值。 接著,會將 Button
新增至 StackLayout
已在頁面 XAML 中定義的 。
注意
擴充 LoadFromXaml
方法允許指定泛型型別自變數。 不過,很少需要指定類型自變數,因為它會從其運作的實例類型推斷。
LoadFromXaml
方法可用來擴充任何 XAML,下列範例會擴充 ContentPage
,然後流覽至它:
using Xamarin.Forms.Xaml;
...
// See the sample for the full XAML string
string pageXAML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<ContentPage xmlns=\"http://xamarin.com/schemas/2014/forms\"\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://xamarin.com/schemas/2014/forms\"\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
屬性。