Udostępnij za pośrednictwem


Ładowanie kodu XAML w środowisku uruchomieniowym

Gdy jest tworzona klasa XAML interfejsu użytkownika aplikacji wieloplatformowej platformy .NET (.NET MAUI), LoadFromXaml metoda jest wywoływana 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();
    }
}

Po skompilowaniu projektu zawierającego plik XAML generator źródła generuje nowe źródło języka C#, które zawiera definicję InitializeComponent metody i dodaje go do obiektu kompilacji. W poniższym przykładzie przedstawiono wygenerowaną InitializeComponent metodę dla MainPage klasy:

private void InitializeComponent()
{
    global::Microsoft.Maui.Controls.Xaml.Extensions.LoadFromXaml(this, typeof(MainPage));
    ...
}

Metoda InitializeComponent wywołuje metodę LoadFromXaml w celu wyodrębnienia skompilowanego pliku binarnego (lub pliku) XAML z pakietu aplikacji. Po wyodrębnieniu inicjuje wszystkie obiekty zdefiniowane w języku XAML, łączy je wszystkie razem 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 środowisku uruchomieniowym

Klasa Extensions w Microsoft.Maui.Controls.Xaml przestrzeni nazw zawiera LoadFromXaml metody rozszerzeń, które mogą służyć do ładowania i analizowania kodu XAML w czasie wykonywania. Metody LoadFromXaml to public, dlatego można wywołać z aplikacji .NET MAUI do załadowania i przeanalizować język XAML w czasie wykonywania. Umożliwia to korzystanie ze scenariuszy, takich jak pobieranie kodu XAML przez aplikację z usługi internetowej, tworzenie wymaganego widoku z kodu XAML i wyświetlanie go w aplikacji.

Ostrzeżenie

Ładowanie kodu XAML w czasie wykonywania ma znaczny koszt wydajności i ogólnie należy unikać.

Ostrzeżenie

Ładowanie kodu XAML w czasie wykonywania nie jest bezpieczne i nie powinno być używane z pełnym przycinaniem ani nativeAOT. Można ją bezpiecznie przycinać, dodając adnotacje do wszystkich typów, które można załadować w czasie wykonywania za pomocą atrybutu DynamicallyAccessedMembers lub atrybutu DynamicDependency . Jest to jednak bardzo podatne na błędy i nie jest zalecane. Ponadto ładowanie kodu XAML w czasie wykonywania ma znaczny koszt wydajności. Aby uzyskać więcej informacji, zobacz Trim a .NET MAUI app and Native AOT deployment (Przycinanie aplikacji MAUI platformy .NET) i Native AOT deployment (Wdrażanie natywnego rozwiązania AOT).

Poniższy przykład kodu przedstawia proste użycie:

string navigationButtonXAML = "<Button Text=\"Navigate\" />";
Button navigationButton = new Button().LoadFromXaml(navigationButtonXAML);
...
stackLayout.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 trzeba określić argument 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:

// 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);

Elementy dostępu

Ładowanie kodu XAML w czasie wykonywania za LoadFromXaml pomocą metody nie umożliwia silnie typizowanego dostępu 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://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";

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.