Visual如何将Drawing对象列表传递给渲染系统?

时间:2013-03-03 00:38:49

标签: wpf

我正在试图弄清楚WPF渲染系统是如何工作的,现在我陷入了困境 有问题的几天:

Visual如何将Drawing对象列表传递给渲染系统?

我没有看到用于此目的的Visual成员。

简单地说,我必须实现的目标:

public class MyVisual : Visual
{
   // ???
}

这样

DrawingGroup dg = VisualTreeHelper.GetDrawing( new MyVisual() );

变为非null(有效的DrawingGroup对象)?

编辑(2013年3月14日):

我预计这个问题应该很容易为任何人回答 了解WPF,但看起来并非如此。

我在一个多星期前问了这个问题,这是非常具体,具体, 关于WPF架构的基本问题仍未得到解决 为WPF提供了如此多的专家。它是否可行,没有人 实际上,那些回答了这么多“上层”问题的WPF专家 不知道WPF如何在它的基础级别运行?

实际上,我的问题实际上是:是否有真正的WPF专家或是它 如此神秘,超出了人类的理解?

3 个答案:

答案 0 :(得分:1)

要使DrawingGroup dg = VisualTreeHelper.GetDrawing( new MyVisual() );生效,您需要覆盖Visual.GetDrawing。但是,这是一种internal virtual方法,因此您无法覆盖它。

我不认为直接从Visual派生是受支持的情景;您应该从UIElement派生或使用(通过组合或继承)其他Visual派生类之一,例如DrawingVisual(公开公共RenderOpen方法)。

答案 1 :(得分:1)

正如布拉德利所提到的那样,你应该从DrawingVisual而不是Visual派生出来来实现这一目标。


你正在倒退。在您向其中呈现内容之前,Visual为空。那个东西可以是空的DrawingGroup ......

获取与DrawingGroup

的内容相对应的Visual
DrawingGroup dg = new DrawingGroup();
using (DrawingContext myContext = myVisual.RenderOpen())
    myContext.DrawDrawing(dg);

RenderOpen和处置DrawingContext之间发生的所有事情都会进入DrawingGroup Visual内部存储。

之后,

VisualTreeHelper.GetDrawing( myVisual )

将是一个非null DrawingGroup(我没有检查它是上面创建的那个,还是WPF创建的DrawingGroup里面有一个项目,上面创建的那个项目。“ / p>

如果你想VisualTreeHelper.GetDrawing( new MyVisual() )工作,你只需要在MyVisual的构造函数中执行上述操作:

MyVisual()
{
    using (DrawingContext myContext = RenderOpen())
        myContext.DrawDrawing(new DrawingGroup());
}

然后,GetDrawing使用的内部数据结构已正确设置。无需覆盖它。

答案 2 :(得分:0)

[对Phil的回答:除了Visual没有方法OnRender之外,这会很好。你实际上是在谈论UIElement。]

如果有人可以确认来自MSDN的这一行不正确,我会感到满意:

“Visual对象提供以下支持: [除其他事项外] - 输出显示:渲染视觉的持久化,序列化绘图内容......“。

由于UIElement,ContainerVisual或Viewport3DVisual都有不同的绘制内容交付机制,这意味着Visual本身没有一个中心(多态)的Drawing交付机制,但这些角色属于这三个预定义的类(在其他单词,你不能创建不会从这三个中的一个派生的新类型的Visual,因为渲染系统将无法渲染它,因为它只知道如何处理这三个类,而不是Visual本身。)

我是对的吗?

编辑:

否。这个结论是不正确的,因为它们完全基于MICROSOFT文件中提供的内容。对于可视对象而言,还有更多的文档。更多地使用反思。