Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.