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 public
ve 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 string
XAML'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ış monkeyName
bir Label
içerir.