xaml
Praca z niestandardowymi plikami XAML
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.