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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow