您可以在OnRender覆盖期间在多个位置渲染StreamGeometry对象吗? [英] Can you render a StreamGeometry object in multiple places during an OnRender override?

查看:85
本文介绍了您可以在OnRender覆盖期间在多个位置渲染StreamGeometry对象吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

We have a StreamGeometry object which we would like to render in about 400 different locations during the OnRender call. The problem is, of course, that a geometry object uses absolute coordinates.

尽管我们当然可以在render调用之前应用转换,但这实际上意味着我们也将创建400个转换,这似乎有些过分.

While we could of course apply transforms before the render call, that means we'd in essence be creating 400 transforms as well, which just seems like overkill.

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

We just want to say 'Render this in that location, like this (Note: DrawGeometryAtPoint is fictitious)...

protected override void OnRender(System.Windows.Media.DrawingContext dc)
{
    base.OnRender(dc);

    var myGeometry = new StreamGeometry();

    // Code to init the geometry goes here

   // Render the same geometry but at four different locations
    dc.DrawGeometryAtPoint(Brush1, Pen1, myGeometry, Origin1);
    dc.DrawGeometryAtPoint(Brush2, Pen2, myGeometry, Origin2);
    dc.DrawGeometryAtPoint(Brush3, Pen3, myGeometry, Origin3);
    dc.DrawGeometryAtPoint(Brush4, Pen4, myGeometry, Origin4);
}

那可以做到吗?

推荐答案

这与上一个问题.

您可以在每次渲染之前推动单独的变换.

Either you push a separate transform before each rendering.

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

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

This is essentially the same as putting a GeometryDrawing in a DrawingGroup and set the DrawingGroup.Transform property.

或者您将StreamGeometry放入GeometryGroup中,然后在其中设置Transform.

Or you put the StreamGeometry into a GeometryGroup and set the Transform there.

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;

正如我在对另一个问题的评论中告诉您的那样,没有办法来解决每个 Same Geometry在不同位置的渲染都具有单独的Transform对象的问题.位置.

As i told you in my comment to the other question, there is no way to get around having a separate Transform object for every rendering of the same Geometry at different locations.

您应该考虑其他设计.不必每次对象稍微移动一次就运行一次完整的OnRender传递,而是应该渲染一次 ,然后仅更改Tranform对象.那么,那当然不应该被冻结.因此,您不会在某些控件中覆盖OnRender,而是提供一个特殊的控件,该控件托管一个DrawingVisual .

You should consider a different design. Instead of running a complete OnRender pass each time your objects move a bit, you should render once and afterwards only change the Tranform objects. Which must then of course not be frozen. Therefore you would not override OnRender in some control, but provide a special control that hosts a DrawingVisual.

这篇关于您可以在OnRender覆盖期间在多个位置渲染StreamGeometry对象吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆