Ładowanie kodu XAML w środowisku uruchomieniowym w programie Xamarin.Forms
Xamarin.Forms.Xaml
Przestrzeń nazw zawiera dwie LoadFromXaml
metody rozszerzenia, które mogą służyć do ładowania i analizowania kodu XAML w czasie wykonywania.
Tło
Po utworzeniu Xamarin.Forms klasy XAML metoda jest wywoływana LoadFromXaml
pośrednio. Dzieje się tak, ponieważ plik za kodem dla klasy XAML wywołuje metodę InitializeComponent
z jego konstruktora:
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
}
Gdy program Visual Studio skompiluje projekt zawierający plik XAML, analizuje plik XAML w celu wygenerowania pliku kodu C# (na przykład MainPage.xaml.g.cs), który zawiera definicję InitializeComponent
metody:
private void InitializeComponent()
{
global::Xamarin.Forms.Xaml.Extensions.LoadFromXaml(this, typeof(MainPage));
...
}
Metoda InitializeComponent
wywołuje metodę LoadFromXaml
w celu wyodrębnienia pliku XAML (lub skompilowanego pliku binarnego) z biblioteki .NET Standard. Po wyodrębnieniu inicjuje wszystkie obiekty zdefiniowane w pliku XAML, łączy je ze sobą w relacjach nadrzędny-podrzędny, dołącza programy obsługi zdarzeń zdefiniowane w kodzie do zdarzeń ustawionych w pliku XAML i ustawia wynikowe drzewo obiektów jako zawartość strony.
Ładowanie kodu XAML w czasie wykonywania
Metody LoadFromXaml
to public
, dlatego można wywoływać z Xamarin.Forms aplikacji do załadowania i analizować kod XAML w czasie wykonywania. Umożliwia to scenariusze, takie jak aplikacja pobierająca kod XAML z usługi internetowej, tworząc wymagany widok z kodu XAML i wyświetlając go w aplikacji.
Ostrzeżenie
Ładowanie kodu XAML w czasie wykonywania ma znaczny koszt wydajności i ogólnie należy unikać.
Poniższy przykład kodu przedstawia proste użycie:
using Xamarin.Forms.Xaml;
...
string navigationButtonXAML = "<Button Text=\"Navigate\" />";
Button navigationButton = new Button().LoadFromXaml(navigationButtonXAML);
...
_stackLayout.Children.Add(navigationButton);
W tym przykładzie Button
tworzone jest wystąpienie z ustawioną wartością Text
właściwości z kodu XAML zdefiniowanego w pliku string
. Element Button
jest następnie dodawany do elementu StackLayout
zdefiniowanego w języku XAML dla strony.
Uwaga
LoadFromXaml
Metody rozszerzenia umożliwiają określenie argumentu typu ogólnego. Jednak rzadko jest konieczne określenie argumentu typu, ponieważ zostanie on wywnioskowany z typu wystąpienia, na który działa.
Metoda LoadFromXaml
może służyć do zawyżania dowolnego kodu XAML, przy czym następujące przykładowe zawyżanie wartości a ContentPage
następnie przejście do niej:
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);
Uzyskiwanie dostępu do elementów
Ładowanie kodu XAML w czasie wykonywania za LoadFromXaml
pomocą metody nie zezwala na silnie typizowane dostęp do elementów XAML, które mają określone nazwy obiektów środowiska uruchomieniowego (przy użyciu metody x:Name
). Te elementy XAML można jednak pobrać przy użyciu metody , a następnie uzyskać do nich dostęp zgodnie z FindByName
wymaganiami:
// 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";
...
W tym przykładzie kod XAML dla elementu ContentPage
jest zawyżony. Ten kod XAML zawiera Label
nazwę monkeyName
, która jest pobierana przy użyciu FindByName
metody przed ustawieniem jej Text
właściwości.