xaml
Lavorare con file XAML personalizzati
Ricerca…
Leggere un oggetto da XAML
Si consideri che una struttura delle seguenti classi dovrebbe essere costruita in XAML e quindi letta in un oggetto 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; }
}
}
Le classi non dovrebbero avere un costruttore esplicito o fornire uno vuoto. Per mantenere pulito XAML, è necessario inizializzare le raccolte. È anche possibile inizializzare le raccolte in XAML.
Per leggere XAML è possibile utilizzare la classe XamlServices . È definito in System.Xaml che deve essere aggiunto ai riferimenti. La seguente riga legge quindi il file test.xaml dal disco:
Test test = XamlServices.Load("test.xaml") as Test;
Il metodo XamlServices.Load ha diversi overload da caricare da flussi e altre fonti. Se si legge XAML da un file incorporato (come è fatto in WPF), la proprietà Build Action impostata su Page per impostazione predefinita deve essere modificata in ie Embedded Resource . Altrimenti il compilatore chiederà i riferimenti agli assembly WPF.
Il contenuto del file XAML da leggere dovrebbe essere simile a questo:
<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>
La pura definizione xmlns consente l'uso di classi nello stesso spazio dei nomi senza prefisso. La definizione di xmlns:x è necessaria per usare costrutti come {x:Null} . Ovviamente i prefissi per altri namespace o assembly possono essere definiti secondo necessità.
Scrivere un oggetto su XAML
Si consideri che una struttura delle seguenti classi dovrebbe essere costruita in XAML e quindi letta in un oggetto 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; }
}
}
Per scrivere XAML è possibile utilizzare la classe XamlServices . È definito in System.Xaml che deve essere aggiunto ai riferimenti. La seguente riga scrive quindi il test istanza che è di tipo Test sul file test.xaml su disco:
XamlServices.Save("test.xaml", test);
Il metodo XamlServices.Save ha diversi overload da scrivere su stream e altri target. Il risultato XAML dovrebbe assomigliare a questo:
<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>
La pura definizione xmlns consente l'uso di classi nello stesso spazio dei nomi senza prefisso. La definizione di xmlns:x è necessaria per usare costrutti come {x:Null} . Il writer aggiunge automaticamente xmlns:scg per inizializzare un List<TestChild> per la proprietà Children dell'oggetto Test . Non si basa sulla proprietà inizializzata dal costruttore.