2010-06-10 4 views
1

Ive a trouvé que vous pouvez sérialiser un composant WPF, dans mon exemple un FixedDocument, en utilisant le XamlWriter et MemoryStream:composant sérialisation WPF en utilisant XamlWriter sans constructeur par défaut

FixedDocument doc = GetDocument(); 
MemoryStream stream = new MemoryStream(); 
XamlWriter.Save(doc, stream); 

Et puis le récupérer:

stream.Seek(0, SeekOrigin.Begin); 
FixedDocument result = (FixedDocument)XamlReader.Load(stream); 
return result; 

Cependant, maintenant je dois également pouvoir sérialiser un DocumentPage. Qui manque un constructeur par défaut qui fait l'appel XamlReader.Load jeter une exception.

Existe-t-il un moyen de sérialiser un composant wpf sans constructeur par défaut?

Répondre

1

Voici une technique.

Créez d'abord une extension Markup pouvant construire la classe souhaitée. Un super-simple serait:

public class DocumentPageExtension : MarkupExtension 
{ 
    public Visual Visual { get; set; } 
    public Size PageSize { get; set; } 
    public Rect BleedBox { get; set; } 
    public Rect ContentBox { get; set; } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
    return new DocumentPage(Visual, PageSize, BleedBox, ContentBox); 
    } 
} 

Maintenant, après XamlWriter écrit votre document, il suffit de remplacer « DocumentPage » avec « mon: DocumentPageExtension », en ajoutant une déclaration d'espace de noms approprié en haut du fichier.

Le fichier résultant doit être lisible par XamlReader.Load.

Il est possible que XamlWriter ne stocke pas les valeurs des propriétés en lecture seule telles que celles trouvées dans DocumentPage. (J'utilise presque toujours un remplacement de XamlWriter que j'ai écrit il y a un moment.) S'il ne sérialise pas ces propriétés du tout, la technique donnée ici devra être complétée par un autre moyen d'obtenir ces valeurs de propriété dans le premier XAML. endroit.

Notez également qu'un constructeur général appelant MarkupExtension peut être créé plutôt que "boîtier spécial" chaque objet qui doit être géré de cette manière.

+0

J'ai un vague souvenir d'essayer quelque chose comme ça. Je pense que c'est devenu l'instance Visual à l'intérieur de DocumentPage qui était tout aussi problématique. Et en effet quelques problèmes avec les propriétés en lecture seule. Mais je vérifie le MarkupExtension, merci! – Mizipzor

Questions connexes