尝试为某些WPF元素创建可视化工具,包括DrawingImage
和UIElement
等。虽然creating a visualizer很简单,但我的可视化工具总是抛出目标对象类型的异常(DrawingImage
并且UIElement
未标记为可序列化。
进一步阅读显示我需要实现VisualizerObjectSource
来提供自定义序列化。此类被指定为DebuggerVisualizer
属性中的参数之一。我按照这些步骤操作,现在我的自定义序列化程序被调用,但我真的不知道该怎么做。以下是调用的相关函数:
public override void GetData(object target, Stream outgoingData)
{
var writer = new StreamWriter(outgoingData);
writer.WriteLine(/*???*/);
writer.Flush();
}
不准确理解它对我的期望(UIElement
的二进制序列化版本?)以及我如何写UIElement
或DrawingImage
到传出流。有人以前做过这个吗?
答案 0 :(得分:2)
最后通过它来管理我。它比我想象的要简单得多。对于任何试图找到自己的方式的人来说,这是它的工作原理:
首先,GetData()
覆盖(阅读问题)将由您管理。您必须决定要将哪些内容发送到可视化工具。发送足够的信息,以便您能够在Show()
调用中重新构建对象。
对于WPF元素,序列化证明比我想的更简单。您可以使用内置的XamlReader
和XamlWriter
类来执行WPF对象的序列化/反序列化。
在Show()
中重建对象后,只需在Form
中显示该对象即可。请注意,Visual Studio仅支持旧式Form
和Control
类(即WinForms),而不支持WPF Window
,但您可以通过放置ElementHost
来解决此问题在您的表单或控件中,然后将重构的WPF对象指定为此ElementHost
的子项。
您可能需要在ViewBox
和重建对象之间添加ElementHost
图层,以便在可用空间中优雅地适应它。
如果有人有兴趣,我已上传WPFVisualizers project on GitHub。目前,它包含两个DrawingImage
和UIElement
类型的可视化工具。这些一起涵盖了WPF世界的大部分视觉元素,但您可以自由添加更多类型以备不时之需。该项目包含VisualizerBase
类,其中包含所有可视化器序列化/通信逻辑。这使得创建新的WPF可视化器与编写1行代码一样简单,如下所示:
public class GeometryDrawingVisualizer : VisualizerBase<GeometryDrawing, GeometryDrawingControl>
{
}
就是这样。您已为GeometryDrawing
类型创建了新的可视化工具。第二个通用参数(上例中的GeometryDrawingControl
)是构成可视化工具UI的WinForms Control
(或Form
,如果您愿意)。在控件中放置一个ElementHost
,然后放入您需要渲染的任何类型。