用于WPF元素的可视化工具
本文关键字:可视化 工具 元素 WPF 用于 | 更新日期: 2023-09-27 18:05:40
尝试为一些WPF元素创建可视化器,包括DrawingImage
和UIElement
等。虽然创建可视化器是微不足道的,但我的可视化器总是抛出异常,目标对象类型(即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()
覆盖(阅读问题)是由YOU管理的。你必须决定你想要发送给可视化器的内容。发送足够的信息,以便您能够在Show()
调用中构造对象。
对于WPF元素,序列化被证明比我想象的要简单得多。您可以使用内置的XamlReader
和XamlWriter
类来执行WPF对象的序列化/反序列化。
一旦你在Show()
中重建了对象,它只是一个在Form
中显示它的问题。请注意,Visual Studio只支持老派的Form
和Control
类(即WinForms),而不支持WPF Window
类,但您可以通过在窗体或控件中放置ElementHost
,然后将重建的WPF对象分配为该ElementHost
的子对象来解决此问题。
你可能想在你的ElementHost
和重建对象之间添加一个ViewBox
层,以使它优雅地适应可用的空间。
我已经在GitHub上上传了WPFVisualizers项目,以防有人感兴趣。目前它包含两个可视化器,DrawingImage
和UIElement
类型。这些组合在一起涵盖了WPF世界的大部分视觉元素,但如果需要的话,您可以自由添加更多类型。该项目包含VisualizerBase
类,其中包含所有可视化器序列化/通信逻辑。这使得创建新的WPF可视化器就像编写一行代码一样简单,像这样:
public class GeometryDrawingVisualizer : VisualizerBase<GeometryDrawing, GeometryDrawingControl>
{
}
就是这样。您已经为GeometryDrawing
类型创建了一个新的可视化工具。第二个通用参数(上面示例中的GeometryDrawingControl
)是WinForms Control
(或者Form
,如果您愿意),它将构成可视化工具的UI。在控件中放置一个ElementHost
,然后放入你需要渲染的任何类型