0

OnRender 呼び出し中に約 400 の異なる場所でレンダリングしたい StreamGeometry オブジェクトがあります。もちろん、問題はジオメトリ オブジェクトが絶対座標を使用することです。

もちろん、レンダー コールの前に変換を適用することもできますが、それは本質的に 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;

他の質問へのコメントで述べたように、異なる場所で同じGeometry をレンダリングするたびに個別の Transform オブジェクトを持つことを回避する方法はありません。


編集: 別のデザインを検討する必要があります。オブジェクトが少し移動するたびに完全な OnRender パスを実行する代わりに、一度レンダリングしてから、Tranform オブジェクトのみを変更する必要があります。もちろん、これは凍結してはなりません。したがって、一部のコントロールで OnRender をオーバーライドするのではなく、 DrawingVisual をホストする特別なコントロールを提供します。

于 2012-12-17T20:04:06.607 に答える