WPF元素的Visualizer

时间:2016-09-05 17:03:56

标签: c# wpf visual-studio debuggervisualizer

尝试为某些WPF元素创建可视化工具,包括DrawingImageUIElement等。虽然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的二进制序列化版本?)以及我如何写UIElementDrawingImage到传出流。有人以前做过这个吗?

1 个答案:

答案 0 :(得分:2)

最后通过它来管理我。它比我想象的要简单得多。对于任何试图找到自己的方式的人来说,这是它的工作原理:

首先,GetData()覆盖(阅读问题)将由您管理。您必须决定要将哪些内容发送到可视化工具。发送足够的信息,以便您能够在Show()调用中重新构建对象。

对于WPF元素,序列化证明比我想的更简单。您可以使用内置的XamlReaderXamlWriter类来执行WPF对象的序列化/反序列化。

Show()中重建对象后,只需在Form中显示该对象即可。请注意,Visual Studio仅支持旧式FormControl类(即WinForms),而不支持WPF Window,但您可以通过放置ElementHost来解决此问题在您的表单或控件中,然后将重构的WPF对象指定为此ElementHost的子项。

您可能需要在ViewBox和重建对象之间添加ElementHost图层,以便在可用空间中优雅地适应它。

如果有人有兴趣,我已上传WPFVisualizers project on GitHub。目前,它包含两个DrawingImageUIElement类型的可视化工具。这些一起涵盖了WPF世界的大部分视觉元素,但您可以自由添加更多类型以备不时之需。该项目包含VisualizerBase类,其中包含所有可视化器序列化/通信逻辑。这使得创建新的WPF可视化器与编写1行代码一样简单,如下所示:

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

就是这样。您已为GeometryDrawing类型创建了新的可视化工具。第二个通用参数(上例中的GeometryDrawingControl)是构成可视化工具UI的WinForms Control(或Form,如果您愿意)。在控件中放置一个ElementHost,然后放入您需要渲染的任何类型。