xaml
Работа с пользовательскими файлами XAML
Поиск…
Чтение объекта из XAML
Рассмотрим структуру следующих классов, которые должны быть построены в XAML, а затем читать в объект 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; }
}
}
Классы должны либо не иметь явного конструктора, либо содержать пустой. Чтобы сохранить XAML в чистоте, коллекции необходимо инициализировать. Инициализация коллекций в XAML также возможна.
Для чтения XAML можно использовать класс XamlServices . Он определен в System.Xaml который необходимо добавить к ссылкам. Следующая строка затем считывает файл test.xaml с диска:
Test test = XamlServices.Load("test.xaml") as Test;
Метод XamlServices.Load имеет несколько перегрузок для загрузки из потоков и других источников. Если вы читаете XAML из встроенного файла (как это сделано в WPF), свойство Build Action , установленное на Page по умолчанию, должно быть изменено на ie Embedded Resource . В противном случае компилятор запросит ссылки на сборки WPF.
Содержимое файла XAML для чтения должно выглядеть примерно так:
<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>
Чистое определение xmlns позволяет использовать классы в одном и том же пространстве имен без префикса. Определение xmlns:x необходимо использовать конструкты типа {x:Null} . Конечно, префиксы для других пространств имен или сборок могут быть определены по мере необходимости.
Запись объекта в XAML
Рассмотрим структуру следующих классов, которые должны быть построены в XAML, а затем читать в объект 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; }
}
}
Для написания XAML можно использовать класс XamlServices . Он определен в System.Xaml который необходимо добавить к ссылкам. Следующая строка затем записывает test экземпляра, который имеет тип Test для файла test.xaml на диске:
XamlServices.Save("test.xaml", test);
Метод XamlServices.Save имеет несколько перегрузок для записи в потоки и другие цели. Полученный XAML должен выглядеть примерно так:
<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>
Чистое определение xmlns позволяет использовать классы в одном и том же пространстве имен без префикса. Определение xmlns:x необходимо использовать конструкты типа {x:Null} . Писатель автоматически добавляет xmlns:scg для инициализации List<TestChild> для свойства Children объекта Test . Он не полагается на свойство, которое инициализируется конструктором.