Suche…


Ein Objekt aus XAML lesen

Betrachten Sie eine Struktur der folgenden Klassen, die in XAML erstellt und dann in ein CLR-Objekt eingelesen werden sollen:

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

Klassen sollten entweder keinen expliziten Konstruktor haben oder einen leeren bereitstellen. Um die XAML sauber zu halten, müssen Sammlungen initialisiert werden. Das Initialisieren von Sammlungen in XAML ist jedoch ebenfalls möglich.

Zum Lesen von XAML kann die XamlServices Klasse verwendet werden. Es ist in System.Xaml definiert, das den Referenzen hinzugefügt werden muss. Die folgende Zeile liest dann die Datei test.xaml von der Festplatte:

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

Die XamlServices.Load Methode verfügt über mehrere Überladungen zum Laden aus Streams und anderen Quellen. Wenn XAML aus einer eingebetteten Datei gelesen wird (wie in WPF), muss die Build Action Eigenschaft, die standardmäßig auf Page , beispielsweise in Embedded Resource geändert werden. Andernfalls fordert der Compiler Verweise auf WPF-Assemblys auf.

Der Inhalt der zu lesenden XAML-Datei sollte in etwa wie folgt aussehen:

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

Die reine xmlns Definition erlaubt die Verwendung von Klassen im selben Namespace ohne Präfix. Die Definition von xmlns:x ist notwendig, um Konstrukte wie {x:Null} . Natürlich können Präfixe für andere Namespaces oder Assemblys nach Bedarf definiert werden.

Ein Objekt in XAML schreiben

Betrachten Sie eine Struktur der folgenden Klassen, die in XAML erstellt und dann in ein CLR-Objekt eingelesen werden sollen:

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

Zum Schreiben von XAML kann die XamlServices Klasse verwendet werden. Es ist in System.Xaml definiert, das den Referenzen hinzugefügt werden muss. Die folgende Zeile schreibt dann den Instanz - test , die vom Typ - Test auf die Datei test.xaml auf der Festplatte:

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

Die XamlServices.Save Methode hat mehrere Überladungen zum Schreiben von Streams und anderen Zielen. Das resultierende XAML sollte ungefähr so ​​aussehen:

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

Die reine xmlns Definition erlaubt die Verwendung von Klassen im selben Namespace ohne Präfix. Die Definition von xmlns:x ist notwendig, um Konstrukte wie {x:Null} . Der Writer fügt automatisch xmlns:scg , um eine List<TestChild> für die Children Eigenschaft des Test Objekts zu initialisieren. Es ist nicht darauf angewiesen, dass die Eigenschaft vom Konstruktor initialisiert wird.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow