Udostępnij za pośrednictwem


Ł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.