2016-09-05 18 views
4

試圖創造一些WPF元素展示臺包括DrawingImageUIElement等雖然creating a visualizer是微不足道的,我的展示臺總是拋出異常目標對象類型(DrawingImageUIElement那是)是沒有標記爲可序列展臺爲WPF元素

進一步閱讀揭示了我需要實現VisualizerObjectSource來提供自定義序列化。該類被指定爲DebuggerVisualizer屬性中的一個參數。我遵循這些步驟,現在我的自定義序列化程序被調用,但我真的不知道該怎麼做。下面是被調用相關功能:

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

不明白它到底是什麼,從我期待(在UIElement的二進制序列化的版本?),準確地我怎麼寫UIElementDrawingImage到流出的流。任何人都曾經這樣做過?

回答

2

終於通過它管理我的方式。這比我想象的要簡單得多。對於其他人試圖找到他們的方式,這裏是它是如何工作的:

首先,GetData()覆蓋(讀取問題)是由您管理。您必須決定要將什麼發送到可視化工具。發送足夠的信息,以便您可以在Show()調用中構造對象。

對於WPF元素,序列化證明比我想象的更簡單。有內置的XamlReaderXamlWriter類,您可以使用它們來執行WPF對象的序列化/反序列化。

一旦您重建了Show()中的對象,只需將其顯示在Form中即可。請注意,Visual Studio僅支持老派FormControl類(即WinForms),但不支持WPF Window s,但可以通過將ElementHost放置在窗體或控件中,然後將重建的WPF對象指定爲此子項來解決此問題ElementHost

您可能需要在ElementHost與重建對象之間添加一個ViewBox圖層,以便在可用空間中優雅地適應它。

我上傳了WPFVisualizers project on GitHub以防萬一有人感興趣。目前它包含兩個可視化工具,分別爲DrawingImageUIElement類型。它們共同涵蓋了WPF世界的大部分視覺元素,但您可以自由添加更多類型以防止需要某些內容。該項目包含VisualizerBase類,其中包含所有可視化器序列化/通信邏輯。這使得創建新的WPF可視化器與編寫1行代碼一樣簡單,如下所示:

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

就是這樣。您已爲GeometryDrawing類型創建了一個新的可視化工具。第二個通用參數(上例中的GeometryDrawingControl)是構成可視化器UI的WinForms Control(或Form,如果您願意的話)。將ElementHost放置在您的控件中,然後放入您需要呈現的類型。

+0

看起來很有希望。順便說一個不錯的。 – Mrgn