Поиск…


Чтение объекта из 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 . Он не полагается на свойство, которое инициализируется конструктором.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow