Çalışma zamanında XAML’yi yükleme
.NET Çok Platformlu Uygulama Kullanıcı Arabirimi (.NET MAUI) XAML sınıfı oluşturulduğunda, dolaylı olarak bir LoadFromXaml yöntem ç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();
}
}
XAML dosyası içeren bir proje oluşturulduğunda, kaynak oluşturucu yöntemin InitializeComponent
tanımını içeren yeni C# kaynağı oluşturur ve derleme nesnesine ekler. Aşağıdaki örnekte sınıfı için oluşturulan InitializeComponent
yöntem gösterilmektedir MainPage
:
private void InitializeComponent()
{
global::Microsoft.Maui.Controls.Xaml.Extensions.LoadFromXaml(this, typeof(MainPage));
...
}
yöntemi, InitializeComponent
uygulama paketinden XAML derlenmiş ikili dosyasını (veya dosyasını) ayıklamak için yöntemini çağırır LoadFromXaml . Ayıklamadan sonra, XAML'de 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’yi yükleme
Extensions
sınıfı, ad alanındaMicrosoft.Maui.Controls.Xaml
, çalışma zamanında XAML'yi yüklemek ve ayrıştırmak için kullanılabilecek uzantı yöntemlerini içerirLoadFromXaml. LoadFromXaml Yöntemler şeklindedir public
ve bu nedenle yüklemek ve çalışma zamanında XAML'yi ayrıştırmak için .NET MAUI uygulamalarından ç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 senaryoları etkinleştirir.
Uyarı
XAML'nin çalışma zamanında yüklenmesi önemli bir performans maliyetine sahiptir ve genellikle kaçınılmalıdır.
Uyarı
Çalışma zamanında XAML'nin yüklenmesi güvenli değildir ve tam kırpma veya NativeAOT ile kullanılmamalıdır. Özniteliği veya özniteliğiyle çalışma zamanında yüklenebilen tüm türlere açıklama eklenerek kırpma güvenli DynamicallyAccessedMembers
DynamicDependency
hale getirilebilir. Ancak bu çok hataya açıktır ve önerilmez. Buna ek olarak, XAML'nin çalışma zamanında yüklenmesi önemli bir performans maliyetine sahiptir. Daha fazla bilgi için bkz . .NET MAUI uygulamasını ve Yerel AOT dağıtımını kırpma.
Aşağıdaki kod örneğinde basit bir kullanım gösterilmektedir:
string navigationButtonXAML = "<Button Text=\"Navigate\" />";
Button navigationButton = new Button().LoadFromXaml(navigationButtonXAML);
...
stackLayout.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:
// See the sample for the full XAML string
string pageXAML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<ContentPage xmlns=\"http://schemas.microsoft.com/dotnet/2021/maui\"\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://schemas.microsoft.com/dotnet/2021/maui\"\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.