Načtení XAML za běhu
Když je vytvořena třída XAML pro víceplatformní rozhraní aplikace .NET (.NET MAUI), LoadFromXaml metoda se nepřímo volá. K tomu dochází, protože soubor kódu pro třídu XAML volá metodu InitializeComponent
z jeho konstruktoru:
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
}
Při sestavení projektu obsahujícího soubor XAML generuje generátor zdrojů nový zdroj jazyka C#, který obsahuje definici metody a přidá ho InitializeComponent
do objektu kompilace. Následující příklad ukazuje vygenerovanou InitializeComponent
metodu MainPage
pro třídu:
private void InitializeComponent()
{
global::Microsoft.Maui.Controls.Xaml.Extensions.LoadFromXaml(this, typeof(MainPage));
...
}
Metoda InitializeComponent
volá metodu LoadFromXaml pro extrahování kompilovaného binárního souboru XAML (nebo jeho souboru) z balíčku aplikace. Po extrakci inicializuje všechny objekty definované v XAML, spojí je všechny v relacích nadřazených a podřízených, připojí obslužné rutiny událostí definované v kódu k událostem nastaveným v souboru XAML a nastaví výsledný strom objektů jako obsah stránky.
Načtení XAML za běhu
Třída Extensions
v Microsoft.Maui.Controls.Xaml
oboru názvů zahrnuje LoadFromXaml rozšiřující metody, které lze použít k načtení a parsování XAML za běhu. Metody LoadFromXaml jsou public
, a proto lze volat z aplikací .NET MAUI pro načtení a parsování XAML za běhu. To umožňuje scénáře, jako je například stažení XAML z webové služby, vytvoření požadovaného zobrazení z XAML a jeho zobrazení v aplikaci.
Upozorňující
Načítání XAML za běhu má značné náklady na výkon a obecně by se mělo vyhnout.
Upozorňující
Načítání XAML za běhu není bezpečné a nemělo by se používat s úplným oříznutím ani nativním objektem AOT. Můžete ho oříznout tak, že označíte všechny typy, které je možné načíst za běhu pomocí DynamicallyAccessedMembers
atributu nebo atributu DynamicDependency
. Toto je ale velmi náchylné k chybám a nedoporučuje se. Načítání XAML za běhu má navíc značné náklady na výkon. Další informace najdete v tématu Oříznutí aplikace .NET MAUI a nativního nasazení AOT.
Následující příklad kódu ukazuje jednoduché použití:
string navigationButtonXAML = "<Button Text=\"Navigate\" />";
Button navigationButton = new Button().LoadFromXaml(navigationButtonXAML);
...
stackLayout.Add(navigationButton);
V tomto příkladu Button se vytvoří instance s hodnotou vlastnosti Text
nastavenou z XAML definovaného v souboru string
. Potom Button se přidá do objektu StackLayout definovaného v XAML pro stránku.
Poznámka:
Metody LoadFromXaml rozšíření umožňují zadat argument obecného typu. Je však zřídka nutné zadat argument typu, protože bude odvozen z typu instance, na které pracuje.
Tuto LoadFromXaml metodu lze použít k nafouknutí libovolného XAML, přičemž následující příklad nafoukne ContentPage a pak na něj přejde:
// 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);
Přístupové prvky
Načítání XAML za běhu pomocí LoadFromXaml metody neumožňuje přístup k elementům XAML se zadanými názvy objektů modulu runtime (pomocí x:Name
). Tyto elementy XAML je však možné načíst pomocí FindByName
metody a pak k němu přistupovat podle potřeby:
// 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";
V tomto příkladu je xaml pro akumulační ContentPage . Tento XAML obsahuje pojmenovaný monkeyName
Label , který je načten pomocí FindByName
metody, před jeho Text
vlastnost je nastavena.