尝试为一些
WPF元素创建可视化工具,包括Drawing
Image和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写入传出流.以前有人这样做过吗?
最佳答案 最后通过它管理我的方式.它比我想象的要简单得多.对于任何试图找到自己的方式的人来说,这是它的工作原理:
首先,GetData()覆盖(读取问题)由您管理.您必须决定要将哪些内容发送到可视化工具.发送足够的信息,以便您能够在Show()调用中重新构造对象.
对于WPF元素,序列化证明比我想的更简单.有内置的XamlReader和XamlWriter类,可用于执行WPF对象的序列化/反序列化.
在Show()中重建对象后,只需在表单中显示它即可.请注意,Visual Studio仅支持旧式的Form和Control类(WinForms),而不支持WPF Windows,但您可以通过在表单或控件中放置ElementHost然后将重构的WPF对象指定为此ElementHost的子项来解决此问题. .
您可能希望在ElementHost和重建对象之间添加ViewBox图层,以便在可用空间中优雅地适应它.
我已经上传了WPFVisualizers project on GitHub,以防有人感兴趣.目前它包含两个可视化器,用于DrawingImage和UIElement类型.这些一起涵盖了WPF世界的大部分视觉元素,但您可以自由添加更多类型以备不时之需.该项目包含VisualizerBase类,其中包含所有可视化器序列化/通信逻辑.这使得创建新的WPF可视化器与编写1行代码一样简单,如下所示:
public class GeometryDrawingVisualizer : VisualizerBase<GeometryDrawing, GeometryDrawingControl>
{
}
而已.您已为GeometryDrawing类型创建了一个新的可视化工具.第二个通用参数(上例中的GeometryDrawingControl)是构成可视化工具UI的WinForms控件(或表格,如果您愿意).将ElementHost放在您的控件中,然后放入您需要渲染的任何类型.