首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF元素可视化器

WPF元素可视化器
EN

Stack Overflow用户
提问于 2016-09-05 17:03:55
回答 1查看 321关注 0票数 4

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

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

代码语言:javascript
复制
public override void GetData(object target, Stream outgoingData)
{
  var writer = new StreamWriter(outgoingData);
  writer.WriteLine(/*???*/);
  writer.Flush();
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-06 15:40:41

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

首先,GetData()覆盖(阅读问题)将由您管理。你必须决定你想要把什么发送到视觉化器。发送足够的信息,以便能够在Show()调用中构造对象。

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

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

您可能需要在您的ViewBox和重构的对象之间添加一个ElementHost层,以便在可用的空间中很好地适应它。

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

代码语言:javascript
复制
public class GeometryDrawingVisualizer : VisualizerBase<GeometryDrawing, GeometryDrawingControl>
{
}

就这样。您已经为GeometryDrawing类型创建了一个新的可视化工具。第二个泛型参数(在上面的示例中是GeometryDrawingControl)是WinForms Control (如果您愿意的话),它将构成可视化器的UI。将一个ElementHost放在您的控件中,然后放入您的类型需要呈现的任何内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39335021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档