Aracılığıyla paylaş


içinde Çalışma Zamanında XAML'i yükleme Xamarin.Forms

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

Background

Bir Xamarin.Forms XAML sınıfı oluşturulduğunda, LoadFromXaml yöntemi dolaylı olarak çağrılır. Bunun nedeni, XAML sınıfının arka planda kod dosyasının InitializeComponent oluşturucusundan yöntemini çağırmasıdır:

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

Visual Studio XAML dosyası içeren bir proje oluşturduğunda, XAML dosyasını ayrıştırarak yönteminin tanımını InitializeComponent içeren bir C# kod dosyası (örneğin, MainPage.xaml.g.cs) oluşturur:

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

yöntemi, InitializeComponent .NET Standard kitaplığından XAML dosyasını (veya derlenmiş ikili dosyasını) ayıklamak için yöntemini çağırır LoadFromXaml . Ayıklamadan sonra, XAML dosyasında tanımlanan tüm nesneleri başlatır, üst-alt ilişkilerde hepsini birbirine bağlar, kodda tanımlanan olay işleyicilerini XAML dosyasında ayarlanan olaylara ekler ve nesnelerin sonuç ağacını sayfanın içeriği olarak ayarlar.

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

LoadFromXaml Yöntemler şeklindedir publicve bu nedenle uygulamalardan Xamarin.Forms yüklenip çalışma zamanında XAML'yi ayrıştırmak için çağrılabilir. Bu, bir uygulamanın bir web hizmetinden XAML indirmesi, XAML'den gerekli görünümü oluşturması ve uygulamada görüntülemesi gibi senaryolara izin verir.

Uyarı

XAML'nin çalışma zamanında yüklenmesi ö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, içinde tanımlanan stringXAML'den özellik değeri ayarlanmış bir Button örnek oluşturulurText. Button daha sonra, sayfa için XAML'de tanımlanmış bir StackLayout öğesine eklenir.

Not

Uzantı yöntemleri genel LoadFromXaml tür bağımsız değişkeninin belirtilmesine izin verir. Ancak, üzerinde çalıştırılacağı örneğin türünden çıkarılacağı için tür bağımsız değişkeninin belirtilmesi nadiren gereklidir.

LoadFromXaml yöntemi herhangi bir XAML'yi şişirmek için kullanılabilir ve aşağıdaki örnek a'yı ContentPage şişirir ve sonra buna doğru ilerler:

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

yöntemiyle LoadFromXaml çalışma zamanında XAML'nin yüklenmesi, belirtilen çalışma zamanı nesne adlarına (kullanarak x:Name) sahip XAML öğelerine kesin olarak türlenmiş erişime izin vermez. Ancak, bu XAML öğeleri yöntemi kullanılarak FindByName alınabilir ve ardından gerektiği gibi 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 ContentPage XAML şişirilir. Bu XAML, özelliği ayarlanmadan FindByName önce Text yöntemi kullanılarak alınan adlandırılmış monkeyNamebir Label içerir.