我正在试图弄清楚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专家或是它 如此神秘,超出了人类的理解?
答案 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文件中提供的内容。对于可视对象而言,还有更多的文档。更多地使用反思。