Wpf 在OnRender覆盖期间,能否在多个位置渲染StreamGeometry对象?

Wpf 在OnRender覆盖期间,能否在多个位置渲染StreamGeometry对象?,wpf,rendering,gdi,Wpf,Rendering,Gdi,我们有一个StreamGeometry对象,我们希望在OnRender调用期间在大约400个不同的位置渲染它。当然,问题是几何体对象使用绝对坐标 虽然我们当然可以在render调用之前应用变换,但这意味着我们实际上也要创建400个变换,这看起来有些过分了 我们只想说‘在那个位置渲染这个,就像这样(注意:DrawGeometryAtPoint是虚构的) 那么这能做到吗?这基本上是同一个问题 或者在每次渲染之前推送一个单独的变换 var transform = new TranslateTransf

我们有一个StreamGeometry对象,我们希望在OnRender调用期间在大约400个不同的位置渲染它。当然,问题是几何体对象使用绝对坐标

虽然我们当然可以在render调用之前应用变换,但这意味着我们实际上也要创建400个变换,这看起来有些过分了

我们只想说‘在那个位置渲染这个,就像这样(注意:DrawGeometryAtPoint是虚构的)


那么这能做到吗?

这基本上是同一个问题

或者在每次渲染之前推送一个单独的变换

var transform = new TranslateTransform(origin.X, origin.Y);
transform.Freeze();
dc.PushTransform();
dc.DrawGeometry(brush, pen, geometry;
dc.Pop();

这与将GeometryDrawing放入DrawingGroup并设置DrawingGroup.Transform属性基本相同

或者将StreamGeometry放入GeometryGroup并在其中设置变换

var transform = new TranslateTransform(origin.X, origin.Y);
transform.Freeze();
var group = new GeometryGroup { Transform = transform };
group.Children.Add(geometry);
dc.DrawGeometry(brush, pen, group;
正如我在对另一个问题的评论中告诉您的那样,对于同一几何体在不同位置的每次渲染,都有一个单独的变换对象是无法避免的



编辑:你应该考虑不同的设计。与每次对象移动一点时运行完整的OnRender过程不同,您应该渲染一次,然后只更改变换对象。当然不能冻结。因此,您不会在某些控件中重写OnRender,而是提供一个特殊的控件。

请记住,如果将VisualBrush与虚拟控件一起使用,则可能需要执行
测量
安排
调用来调整视觉对象的属性大小。不确定这是否可行。我也意识到我的问题可能有误导性,所以我更新了它,以显示我们真正想要的是什么。。。在多个位置渲染StreamGeometry路径。这是一个完全不同的问题。我还将更新我的答案。这并不是完全不同,因为我最初的想法是以自己的视觉效果渲染StreamGeometry,然后在多个地方渲染该视觉效果。不过,正如我上面所说,这是一种试图解决实际问题的尝试。我看到的问题是OnRender实际上并没有进行渲染。它只是设置WPF稍后脱机呈现的DrwingGroups。这就是为什么我不确定在不创建多个TranslateTransform对象和大量Push/Pop调用的情况下我所追求的是什么,这很糟糕。我想你最终不得不接受WPF就是这样。变换对象不需要任何成本。我怀疑创建400个转换是否会带来真正的性能问题。不过,您可能会注意不要频繁调用OnRender。事实上,我们注意到这400存在性能问题,因为实际上,它是在用户滚动时响应滚动条的,因此被放大了。没有转换的代码非常快(但看起来是错误的)。我们一添加转换,滚动性能就明显下降。但正如他们所说,这些都是休息!我一直说我喜欢编程WPF,但我不喜欢WPF的性能。我想这是一种权衡。
var transform = new TranslateTransform(origin.X, origin.Y);
transform.Freeze();
var group = new GeometryGroup { Transform = transform };
group.Children.Add(geometry);
dc.DrawGeometry(brush, pen, group;