尝试为一些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写入传出流。以前有人这样做过吗?
发布于 2016-09-06 15:40:41
最后我还是挺过来了。这比我想象的要简单得多。对于任何试图寻找自己方式的人来说,下面是它的工作原理:
首先,GetData()覆盖(阅读问题)将由您管理。你必须决定你想要把什么发送到视觉化器。发送足够的信息,以便能够在Show()调用中构造对象。
对于WPF元素,序列化比我想的要简单得多。有内置的XamlReader和XamlWriter类,您可以使用它们来执行WPF对象的序列化/反序列化。
一旦您在Show()中重建了对象,它只是在一个Form中显示它的问题。请注意,Visual只支持旧式Form和Control类(即WinForms),而不支持WPF Window,但您可以通过在窗体或控件中放置ElementHost,然后将重构的WPF对象分配为ElementHost的子级来解决此问题。
您可能需要在您的ViewBox和重构的对象之间添加一个ElementHost层,以便在可用的空间中很好地适应它。
我已经上传了基于WPFVisualizers的GitHub项目,以防有人感兴趣。目前,它包含两个可视化器,用于DrawingImage和UIElement类型。这些都涵盖了WPF世界的大部分视觉元素,但您可以自由地添加更多类型,以防您需要一些。该项目包含包含所有可视化器序列化/通信逻辑的VisualizerBase类。这使得创建新的WPF可视化器就像编写1行代码一样简单,如下所示:
public class GeometryDrawingVisualizer : VisualizerBase<GeometryDrawing, GeometryDrawingControl>
{
}就这样。您已经为GeometryDrawing类型创建了一个新的可视化工具。第二个泛型参数(在上面的示例中是GeometryDrawingControl)是WinForms Control (如果您愿意的话),它将构成可视化器的UI。将一个ElementHost放在您的控件中,然后放入您的类型需要呈现的任何内容。
https://stackoverflow.com/questions/39335021
复制相似问题