Carga de XAML en tiempo de ejecución en Xamarin.Forms

Ejemplo de descarga Descarga del ejemplo

El Xamarin.Forms.Xaml espacio de nombres incluye dos LoadFromXaml métodos de extensión que se pueden usar para cargar y analizar XAML en tiempo de ejecución.

Segundo plano

Cuando se Xamarin.Forms construye una clase XAML, se llama LoadFromXaml indirectamente al método . Esto sucede porque el archivo de código subyacente para una clase XAML llama al InitializeComponent método desde su constructor:

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }
}

Cuando Visual Studio compila un proyecto que contiene un archivo XAML, analiza el archivo XAML para generar un archivo de código de C# (por ejemplo, MainPage.xaml.g.cs)que contiene la definición del método :

private void InitializeComponent()
{
    global::Xamarin.Forms.Xaml.Extensions.LoadFromXaml(this, typeof(MainPage));
    ...
}

El InitializeComponent método llama al método para extraer el archivo XAML (o su binario LoadFromXaml compilado) de la biblioteca .NET Standard datos. Después de la extracción, inicializa todos los objetos definidos en el archivo XAML, los conecta todos juntos en relaciones de elementos primarios y secundarios, adjunta los controladores de eventos definidos en el código a los eventos establecidos en el archivo XAML y establece el árbol resultante de objetos como el contenido de la página.

Carga de XAML en tiempo de ejecución

Los LoadFromXaml métodos son y, por lo tanto, se puede llamar a desde aplicaciones para cargar public y analizar XAML en tiempo de Xamarin.Forms ejecución. Esto permite escenarios como que una aplicación descargue XAML desde un servicio web, cree la vista necesaria del XAML y la muestre en la aplicación.

Advertencia

La carga de XAML en tiempo de ejecución tiene un costo de rendimiento significativo y, por lo general, se debe evitar.

En el ejemplo de código siguiente se muestra un uso simple:

using Xamarin.Forms.Xaml;
...

string navigationButtonXAML = "<Button Text=\"Navigate\" />";
Button navigationButton = new Button().LoadFromXaml(navigationButtonXAML);
...
_stackLayout.Children.Add(navigationButton);

En este ejemplo, se crea una instancia de , con su valor de propiedad Button Xamarin_Forms Button _Button_Text" data-linktype="absolute-path">Text establecido a string partir del XAML definido en . A Button continuación, se agrega a StackLayout un que se ha definido en xaml para la página.

Nota:

Los LoadFromXaml métodos de extensión permiten especificar un argumento de tipo genérico. Sin embargo, rara vez es necesario especificar el argumento de tipo, ya que se deducirá del tipo de la instancia en la que funciona.

El método se puede usar para inflar cualquier XAML, con el ejemplo siguiente inflando un y, LoadFromXaml a continuación, ContentPage navegando hasta él:

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

Acceso a elementos

La carga de XAML en tiempo de ejecución con el método no permite el acceso fuertemente especificado a los elementos XAML que tienen nombres de objeto en tiempo de LoadFromXaml ejecución especificados (mediante x:Name ). Sin embargo, estos elementos XAML se pueden recuperar mediante el método y, a FindByName continuación, se puede acceder a ellos según sea necesario:

// 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";
...

En este ejemplo, se infla el CÓDIGO XAML ContentPage de un . Este XAML incluye un denominado , que se recupera mediante el método , antes de que se establezca su propiedad LabelmonkeyName Xamarin_Forms FindByNameLabel _Label_Text" data-linktype="absolute-path">Text property.