0

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

虽然我们当然可以在渲染调用之前应用变换,但这意味着我们本质上也会创建 400 个变换,这似乎有点过头了。

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

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);
}

那么可以做到吗?

4

1 回答 1

0

这与您之前的问题本质上是相同的问题。

要么在每次渲染之前推送单独的变换。

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 并在那里设置 Transform。

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;

正如我在对另一个问题的评论中告诉你的那样,没有办法绕过在不同位置为相同几何图形的每次渲染使用单独的 Transform 对象。


编辑:您应该考虑不同的设计。每次你的对象移动一点时,你应该渲染一次,然后只更改 Tranform 对象,而不是运行一个完整的 OnRender 通道。那当然不能冷冻。因此,您不会在某些控件中覆盖 OnRender,而是提供一个承载 DrawingVisual的特殊控件。

于 2012-12-17T20:04:06.607 回答