2016-09-05 1 views
4

Versuch Visualizer für einige WPF-Elemente zu erstellen, einschließlich DrawingImage und UIElement etc. Während creating a visualizer trivial war, meine visualizers immer Ausnahme aus, dass die Zielobjekttypen (DrawingImage und UIElement das ist) sind nicht als serialisierbar markiert .Visualizer für WPF-Elemente

Weitere Informationen ergaben, dass ich VisualizerObjectSource implementieren muss, um benutzerdefinierte Serialisierung bereitzustellen. Diese Klasse wird als eines der Argumente im Attribut DebuggerVisualizer angegeben. Ich habe diese Schritte ausgeführt und jetzt wird mein benutzerdefinierter Serializer aufgerufen, aber ich weiß nicht, was ich dort tun soll. Hier ist die entsprechende Funktion, die aufgerufen wird:

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

Verstehe nicht genau das, was es von mir erwartet (eine binäre-serialisierte Version des UIElement?) Und genau, wie schreibe ich ein UIElement oder ein DrawingImage zu der ausgehende Stream. Hat jemand das schon mal gemacht?

Antwort

2

Endlich geschafft meinen Weg durch sie. Es ist viel einfacher als ich gedacht hatte. Für jeden anderen, der versucht, seinen Weg zu finden, hier ist, wie es funktioniert:

Erstens, GetData() override (lesen Sie die Frage) soll von Ihnen verwaltet werden. Sie müssen entscheiden, was Sie an den Visualizer senden möchten. Senden Sie genügend Informationen ein, damit Sie das Objekt unter dem Aufruf Show() konstruieren können.

Für WPF-Elemente erwies sich die Serialisierung als viel einfacher als das, was ich dachte. Es gibt integrierte Klassen XamlReader und XamlWriter, die Sie zum Ausführen der Serialisierung/Deserialisierung von WPF-Objekten verwenden können.

Sobald Sie das Objekt in Show() rekonstruiert haben, ist es einfach eine Darstellung in einem Form. Beachten Sie, dass Visual Studio die Klassen Form und Control nur unterstützt (WinForms), nicht WPF Window s, aber Sie können dieses Problem umgehen, indem Sie ein ElementHost in Ihrem Formular oder Steuerelement platzieren und anschließend das rekonstruierte WPF-Objekt als Kind zuweisen ElementHost.

Sie können eine ViewBox Schicht zwischen Ihrem ElementHost und dem rekonstruierten Objekt hinzufügen, um es elegant in den verfügbaren Platz zu passen.

Ich habe die WPFVisualizers project on GitHub hochgeladen, falls jemand interessiert ist. Derzeit enthält es zwei Visualizer für DrawingImage und UIElement Typen. Zusammen decken sie die meisten visuellen Elemente von WPF World ab, aber Sie können weitere Typen hinzufügen, falls Sie welche benötigen. Das Projekt enthält die Klasse VisualizerBase, die die Visualizer-Serialisierungs-/Kommunikationslogik enthält. Dies macht neue WPF visualizers so einfach erstellen, wie das Schreiben 1 Codezeile wie folgt aus:

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

Das ist es. Sie haben einen neuen Visualizer für den Typ GeometryDrawing erstellt. Der zweite generische Parameter (GeometryDrawingControl im obigen Beispiel) ist die WinForms Control (oder Form, wenn Sie möchten), die die Benutzeroberfläche Ihres Visualizers darstellt. Platziere einen ElementHost in deiner Kontrolle und lege dann alles ein, was dein Typ zum Rendern benötigt.

+0

Sieht vielversprechend aus. BTW nett. – Mrgn

Verwandte Themen