2016-09-05 3 views
4

Essayer de créer visualiseurs pour certains éléments WPF, y compris DrawingImage et UIElement etc. Alors que creating a visualizer était trivial, mes visualiseurs jettent toujours exception que les types d'objet cible (DrawingImage et UIElement qui) sont pas marqués comme sérialisable . Une autre lecture a révélé que j'ai besoin de mettre en œuvre VisualizerObjectSource pour fournir une sérialisation personnalisée. Cette classe est spécifiée comme l'un des arguments de l'attribut DebuggerVisualizer. J'ai suivi ces étapes et maintenant mon sérialiseur personnalisé est appelé, mais je ne sais pas vraiment quoi faire là-bas. Voici la fonction correspondante qui est appelée:Visualiseur pour les éléments WPF

public override void GetData(object target, Stream outgoingData) 
{ 
    var writer = new StreamWriter(outgoingData); 
    writer.WriteLine(/*???*/); 
    writer.Flush(); 
} 

ne comprends pas exactement ce qu'il attend de moi (une version binaire sérialisé du UIElement?) Et exactement comment puis-je écrire un UIElement ou un DrawingImage à le flux sortant. Quelqu'un a déjà fait ça?

Répondre

2

Enfin géré mon chemin à travers elle. C'est beaucoup plus simple que je ne le pensais. Pour tous ceux qui essaient de trouver leur chemin, voici comment cela fonctionne:

Premièrement, GetData() override (lisez la question) doit être géré par VOUS. Vous devez décider ce que vous voulez envoyer au visualiseur. Envoyez suffisamment d'informations pour que vous puissiez reconstruire l'objet dans l'appel Show().

Pour les éléments WPF, la sérialisation s'est avérée beaucoup plus simple que ce à quoi je pensais. Il existe des classes XamlReader et XamlWriter intégrées que vous pouvez utiliser pour effectuer la sérialisation/désérialisation des objets WPF. Une fois l'objet reconstruit dans Show(), il suffit de le montrer dans un Form. Notez que Visual Studio prend en charge les anciennes classes Form et Control uniquement (WinForms), pas WPF Window s, mais vous pouvez contourner ce problème en plaçant un ElementHost dans votre formulaire ou votre contrôle, puis en affectant l'objet WPF reconstruit en tant qu'enfant de cette ElementHost.

Vous pouvez ajouter une couche ViewBox entre votre ElementHost et l'objet reconstruit pour l'adapter élégamment dans l'espace disponible.

J'ai téléchargé le WPFVisualizers project on GitHub au cas où quelqu'un serait intéressé. Actuellement, il contient deux visualiseurs, pour DrawingImage et UIElement types. Ensemble, ils couvrent la plupart des éléments visuels du monde WPF, mais vous êtes libre d'ajouter plus de types au cas où vous en auriez besoin. Le projet contient la classe VisualizerBase qui contient toute la logique de sérialisation/communication du visualiseur. Cela permet de créer de nouveaux WPF visualiseurs aussi simple que l'écriture 1 ligne de code, comme ceci:

public class GeometryDrawingVisualizer : VisualizerBase<GeometryDrawing, GeometryDrawingControl> 
{ 
} 

Voilà. Vous avez créé un nouveau visualiseur pour le type GeometryDrawing. Le second paramètre générique (GeometryDrawingControl dans l'exemple ci-dessus) est le WinForms Control (ou Form si vous le souhaitez) qui constituera l'interface utilisateur de votre visualiseur. Placez un ElementHost sous votre contrôle, puis placez ce que votre type a besoin de rendre.

+0

Cela semble prometteur. BTW sympa. – Mrgn