Szukaj…


Odczytywanie obiektu z XAML

Rozważ, że w XAML należy zbudować strukturę następujących klas, a następnie wczytać do obiektu 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; }
    }
}

Klasy nie powinny mieć jawnego konstruktora ani zawierać pustego. Aby utrzymać XAML w czystości, kolekcje muszą zostać zainicjowane. Możliwe jest także inicjowanie kolekcji w XAML.

Aby odczytać XAML, można XamlServices klasy XamlServices . Jest zdefiniowany w System.Xaml który należy dodać do referencji. Następujący wiersz odczytuje plik test.xaml z dysku:

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

Metoda XamlServices.Load ma kilka przeciążeń do załadowania ze strumieni i innych źródeł. Jeśli odczytujesz XAML z osadzonego pliku (tak jak dzieje się to w WPF), właściwość Build Action która jest domyślnie ustawiona na Page , musi zostać zmieniona na np. Embedded Resource . W przeciwnym razie kompilator poprosi o odniesienia do zestawów WPF.

Zawartość pliku XAML do odczytu powinna wyglądać mniej więcej tak:

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

Definicja czystego xmlns pozwala na użycie klas w tej samej przestrzeni nazw bez przedrostka. Definicja xmlns:x jest konieczna do używania konstrukcji takich jak {x:Null} . Oczywiście w razie potrzeby można zdefiniować prefiksy dla innych przestrzeni nazw lub zestawów.

Zapisywanie obiektu do XAML

Rozważ, że w XAML należy zbudować strukturę następujących klas, a następnie wczytać do obiektu 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; }
    }
}

Do napisania XAML można XamlServices klasy XamlServices . Jest zdefiniowany w System.Xaml który należy dodać do referencji. Następujący wiersz zapisuje następnie test instancji typu Test do pliku test.xaml na dysku:

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

Metoda XamlServices.Save ma kilka przeciążeń do zapisu w strumieniach i innych XamlServices.Save docelowych. Wynikowy XAML powinien wyglądać mniej więcej tak:

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

Definicja czystego xmlns pozwala na użycie klas w tej samej przestrzeni nazw bez przedrostka. Definicja xmlns:x jest konieczna do używania konstrukcji takich jak {x:Null} . Program piszący automatycznie dodaje xmlns:scg aby zainicjować List<TestChild> dla właściwości Children obiektu Test . Nie polega on na zainicjowaniu właściwości przez konstruktor.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow