Buscar..


Leyendo un objeto de XAML

Considere que una estructura de las siguientes clases se debe construir en XAML y luego leer en un objeto CLR:

namespace CustomXaml
{
    public class Test
    {
        public string Value { get; set; }
        public List<TestChild> Children { get; set; } = new List<TestChild>(); 
    }

    public class TestChild
    {
        public string StringValue { get; set; }
        public int IntValue { get; set; }
    }
}

Las clases no deben tener un constructor explícito o proporcionar un vacío. Para mantener limpio el XAML, las colecciones deben inicializarse. Sin embargo, también es posible inicializar colecciones en XAML.

Para leer XAML se puede usar la clase XamlServices . Se define en System.Xaml que debe agregarse a las referencias. La siguiente línea luego lee el archivo test.xaml del disco:

Test test = XamlServices.Load("test.xaml") as Test;

El método XamlServices.Load tiene varias sobrecargas para cargar desde flujos y otras fuentes. Si se lee XAML desde un archivo incrustado (como se hace en WPF), la propiedad Build Action que se establece en Page de forma predeterminada debe cambiarse a, por ejemplo, Embedded Resource . De lo contrario, el compilador pedirá referencias a los ensamblados de WPF.

El contenido del archivo XAML para leer debe tener este aspecto:

<Test xmlns="clr-namespace:CustomXaml;assembly=CustomXaml"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Value="test">
    <Test.Children>
        <TestChild StringValue="abc" IntValue="123"/>
        <TestChild StringValue="{x:Null}" IntValue="456"/>
    </Test.Children>
</Test>

La definición de xmlns pura permite el uso de clases en el mismo espacio de nombres sin prefijo. La definición de los xmlns:x es necesaria para usar construcciones como {x:Null} . Por supuesto, los prefijos para otros espacios de nombres o ensamblajes se pueden definir según sea necesario.

Escribiendo un objeto a XAML

Considere que una estructura de las siguientes clases se debe construir en XAML y luego leer en un objeto CLR:

namespace CustomXaml
{
    public class Test
    {
        public string Value { get; set; }
        public List<TestChild> Children { get; set; } = new List<TestChild>(); 
    }
    
    public class TestChild
    {
        public string StringValue { get; set; }
        public int IntValue { get; set; }
    }
}

Para escribir XAML se puede usar la clase XamlServices . Se define en System.Xaml que debe agregarse a las referencias. La siguiente línea escribe la test instancia que es de tipo Test en el archivo test.xaml en el disco:

XamlServices.Save("test.xaml", test);

El método XamlServices.Save tiene varias sobrecargas para escribir en secuencias y otros destinos. El XAML resultante debería verse algo como esto:

<Test Value="test" xmlns="clr-namespace:CustomXaml;assembly=CustomXaml"
                   xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib"
                   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Test.Children>
    <scg:List x:TypeArguments="TestChild" Capacity="4">
      <TestChild IntValue="123" StringValue="abc" />
      <TestChild IntValue="456" StringValue="{x:Null}" />
    </scg:List>
  </Test.Children>
</Test>

La definición de xmlns pura permite el uso de clases en el mismo espacio de nombres sin prefijo. La definición de los xmlns:x es necesaria para usar construcciones como {x:Null} . El escritor agrega automáticamente xmlns:scg para inicializar una List<TestChild> para la propiedad Children del objeto Test . No se basa en que la propiedad sea inicializada por el constructor.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow