共用方式為


在運行時間載入 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

方法 LoadFromXamlpublic,因此可以從應用程式呼叫 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 屬性。