Çalışma zamanında XAML yükleme Xamarin.Forms

Örnek indir Örneği indirin

Xamarin.Forms.XamlAd alanı, LoadFromXaml çalışma zamanında xaml yüklemek ve ayrıştırmak için kullanılabilecek iki uzantı yöntemi içerir.

Arka Plan

Bir Xamarin.Forms xaml sınıfı oluşturulduğunda, LoadFromXaml yöntemi dolaylı olarak çağırılır. Bu durum, bir XAML sınıfı için arka plan kod dosyası InitializeComponent oluşturucudan metodu çağırdığı için oluşur:

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

Visual Studio xaml dosyası içeren bir proje oluşturduğunda, xaml dosyasını, yöntemin tanımını içeren bir C# kod dosyası (örneğin, mainpage. XAML. g. cs) oluşturacak şekilde ayrıştırır :

private void InitializeComponent()
{
    global::Xamarin.Forms.Xaml.Extensions.LoadFromXaml(this, typeof(MainPage));
    ...
}

InitializeComponentYöntemi, LoadFromXaml .NET Standard kitaplığından xaml dosyasını (veya derlenmiş ikilisini) ayıklamak için yöntemini çağırır. Ayıkladıktan sonra XAML dosyasında tanımlı tüm nesneleri başlatır, bunları üst-alt ilişkilerde birlikte birbirlerine bağlar, kodda tanımlanan olay işleyicilerini XAML dosyasında ayarlanmış olaylara iliştirir ve nesnelerin sonuç ağacını sayfanın içeriği olarak ayarlar.

Çalışma zamanında XAML yükleme

LoadFromXamlYöntemler public , ve bu nedenle, çalışma zamanında xaml 'yi Xamarin.Forms yüklemek ve ayrıştırmak için uygulamalardan çağrılabilir. Bu, bir Web hizmetinden XAML indirme, XAML 'den gerekli görünümü oluşturma ve uygulamayı görüntüleme gibi senaryolara izin verir.

Uyarı

Çalışma zamanında XAML yüklemek önemli bir performans maliyetine sahiptir ve genellikle kaçınılmalıdır.

Aşağıdaki kod örneğinde basit bir kullanım gösterilmektedir:

using Xamarin.Forms.Xaml;
...

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

Bu örnekte, Button Xamarin_Forms Button _Button_Text "Data-LinkType =" Absolute-path ">Text özellik değeri içinde tanımlanan xaml 'den ayarlanmakta olan bir örnek oluşturulur string . ButtonDaha sonra, StackLayout sayfanın xaml 'de tanımlanmış olan öğesine eklenir.

Not

LoadFromXamlUzantı yöntemleri genel bir tür bağımsız değişkeninin belirtilmesine izin verir. Ancak, türünün üzerinde çalıştığı örneğin türünden çıkarsanacağı için tür bağımsız değişkenini belirtmek nadiren gereklidir.

LoadFromXamlYöntemi, BIR xaml 'yi almak için kullanılabilir, aşağıdaki örnek bir ContentPage ve daha sonra bu örneğe gidiliyor:

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

Öğelere erişme

Çalışma zamanında XAML 'yi yöntemle yükleme, LoadFromXaml belirtilen çalışma zamanı nesne adlarına (kullanılarak) sahıp xaml öğelerine kesin olarak yazılmış erişime izin vermez x:Name . Ancak, bu XAML öğeleri yöntemi kullanılarak alınabilir FindByName ve sonra gerektiği şekilde erişilebilir:

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

Bu örnekte, için XAML, için XAML ContentPage tarafından belirlenir. Bu XAML, LabelmonkeyName yöntemi kullanılarak alınan, FindByName Xamarin_Forms Label _Label_Text "Data-LinkType =" Absolute-path ">Text özelliği ayarlanmış olarak adlandırılan adlandırılmış bir ada sahiptir.