用于WPF元素的可视化工具

本文关键字:可视化 工具 元素 WPF 用于 | 更新日期: 2023-09-27 18:05:40

尝试为一些WPF元素创建可视化器,包括DrawingImageUIElement等。虽然创建可视化器是微不足道的,但我的可视化器总是抛出异常,目标对象类型(即DrawingImageUIElement) 未标记为可序列化的

进一步阅读显示,我需要实现VisualizerObjectSource来提供自定义序列化。这个类被指定为DebuggerVisualizer属性中的一个参数。我遵循了这些步骤,现在我的自定义序列化器被调用了,但我真的不知道在这里要做什么。下面是被调用的相关函数:

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

不明白它对我的期望是什么(UIElement的二进制序列化版本?)以及我如何将UIElementDrawingImage写到传出流。有人做过吗?

用于WPF元素的可视化工具

最后我总算熬过去了。这比我想象的要简单得多。对于其他试图找到自己的方式的人,下面是它的工作原理:

首先,GetData()覆盖(阅读问题)是由YOU管理的。你必须决定你想要发送给可视化器的内容。发送足够的信息,以便您能够在Show()调用中构造对象。

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

一旦你在Show()中重建了对象,它只是一个在Form中显示它的问题。请注意,Visual Studio只支持老派的FormControl类(即WinForms),而不支持WPF Window类,但您可以通过在窗体或控件中放置ElementHost,然后将重建的WPF对象分配为该ElementHost的子对象来解决此问题。

你可能想在你的ElementHost和重建对象之间添加一个ViewBox层,以使它优雅地适应可用的空间。

我已经在GitHub上上传了WPFVisualizers项目,以防有人感兴趣。目前它包含两个可视化器,DrawingImageUIElement类型。这些组合在一起涵盖了WPF世界的大部分视觉元素,但如果需要的话,您可以自由添加更多类型。该项目包含VisualizerBase类,其中包含所有可视化器序列化/通信逻辑。这使得创建新的WPF可视化器就像编写一行代码一样简单,像这样:

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

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