Načítání XAML za běhu v Xamarin.Forms
Xamarin.Forms.XamlObor názvů obsahuje dvě LoadFromXaml metody rozšíření, které lze použít k načtení a analýze XAML za běhu.
Pozadí
Když Xamarin.Forms je vytvořena třída jazyka XAML, LoadFromXaml Metoda je nepřímo volána. K tomu dochází, protože soubor kódu na pozadí třídy jazyka XAML volá InitializeComponent metodu z jejího konstruktoru:
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
}
když Visual Studio vytvoří projekt obsahující soubor xaml, analyzuje soubor xaml a vygeneruje soubor kódu jazyka C# (například MainPage. XAML. g. cs), který obsahuje definici metody:
private void InitializeComponent()
{
global::Xamarin.Forms.Xaml.Extensions.LoadFromXaml(this, typeof(MainPage));
...
}
InitializeComponentMetoda volá LoadFromXaml metodu pro extrakci souboru XAML (nebo jeho zkompilovaného binárního souboru) z knihovny .NET Standard. Po extrakci inicializuje všechny objekty, které jsou definovány v souboru XAML, spojuje je dohromady v rámci vztahů nadřazenosti a podřízenosti, připojí obslužné rutiny události definované v kódu k událostem nastaveným v souboru XAML a nastaví výsledný strom objektů jako obsah stránky.
Načítání XAML za běhu
LoadFromXamlMetody jsou public a proto mohou být volány z Xamarin.Forms aplikací k načtení a analyzovat XAML za běhu. To umožňuje scénářům, jako je například aplikace stahovat XAML z webové služby, vytvořit požadované zobrazení z XAML a zobrazit ho v aplikaci.
Upozornění
Načítání XAML za běhu má významné náklady na výkon a obecně by se mělo vyhnout.
Následující příklad kódu ukazuje jednoduché použití:
using Xamarin.Forms.Xaml;
...
string navigationButtonXAML = "<Button Text=\"Navigate\" />";
Button navigationButton = new Button().LoadFromXaml(navigationButtonXAML);
...
_stackLayout.Children.Add(navigationButton);
V tomto příkladu Button je vytvořena instance s jeho Xamarin_Forms Button _Button_Text "data-LINKTYPE =" absolutní cesta ">Text hodnota vlastnosti, která je nastavena v jazyce XAML definovaného v string . ButtonJe pak přidáno do StackLayout , který byl definován v jazyce XAML pro stránku.
Poznámka
LoadFromXamlRozšiřující metody umožňují zadat argument obecného typu. Nicméně není nutné určit argument typu, protože bude odvozen z typu instance, na které je spuštěn.
LoadFromXamlMetoda může být použita pro deflaci libovolného XAML, s následujícím příkladem, který je neplochý ContentPage a následně na něj přejde:
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);
Přístup k elementům
Načítání XAML za běhu s LoadFromXaml metodou nepovoluje přístup silně typované k prvkům jazyka XAML, které mají zadané názvy objektů za běhu (pomocí x:Name ). Tyto prvky XAML však lze načíst pomocí FindByName metody a pak podle potřeby použít:
// 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";
...
V tomto příkladu je XAML pro a ContentPage neplochý. Tento kód XAML obsahuje Label název monkeyName , který je načten pomocí FindByName metody, před jeho Xamarin_Forms Label _Label_Text Text je nastavena vlastnost "data-linktype =" absolutní cesta "> .
Stažení ukázky