WPF C#でRapentContext.DrawlineをStreamGeometry Vs
-
21-12-2019 - |
質問
リアルタイムで何百もの線を描くつもりです。これを行うには、 視覚層を選択しました。しかし、ここで行を描くには2つの異なる方法があることがわかります。どちらがより良いパフォーマンスとスピードを得ることをお勧めしますか?
1。DrawingContext.Drawline
public class DrawingTypeOne : FrameworkElement
{
private readonly VisualCollection _visuals;
public DrawingTypeOne(double thickness)
{
var myPen = new Pen
{
Thickness = 1,
Brush = Brushes.White,
};
myPen.Freeze();
_visuals = new VisualCollection(this);
var drawingVisual = new DrawingVisual();
using (var dc = drawingVisual.RenderOpen())
{
dc.DrawLine(myPen, new Point(0,0) , new Point(100,100));
_visuals.Add(drawingVisual);
}
}
protected override Visual GetVisualChild(int index)
{
return _visuals[index];
}
protected override int VisualChildrenCount
{
get
{
return _visuals.Count;
}
}
}
.
2。StreamGeometry
public class DrawingTypeTwo : FrameworkElement
{
private readonly VisualCollection _visuals;
public DrawingTypeTwo()
{
_visuals = new VisualCollection(this);
var geometry = new StreamGeometry();
using (var gc = geometry.Open())
{
gc.BeginFigure(new Point(0, 0), true, true);
gc.LineTo(new Point(100,100), true, false);
}
geometry.Freeze();
var drawingVisual = new DrawingVisual();
using (var dc = drawingVisual.RenderOpen())
{
dc.DrawGeometry(Brushes.Red, null, geometry);
}
_visuals.Add(drawingVisual);
}
protected override Visual GetVisualChild(int index)
{
return _visuals[index];
}
protected override int VisualChildrenCount
{
get
{
return _visuals.Count;
}
}
}
. 解決
私が言ったように私はあなたがすべてのあなたの行を持つことができるのはあなただけの視覚的なものだけを必要としているだけです。
これを見てみましょう:
最初に私たちの描画コンテキスト内に複数の図面を定義します:
class EllipseAndRectangle : DrawingVisual
{
public EllipseAndRectangle()
{
using (DrawingContext dc = RenderOpen())
{
// Black ellipse with blue border
dc.DrawEllipse(Brushes.Black,
new Pen(Brushes.Blue, 3),
new Point(120, 120), 20, 40);
// Red rectangle with green border
dc.DrawRectangle(Brushes.Red,
new Pen(Brushes.Green, 4),
new Rect(new Point(10, 10), new Point(80, 80)));
}
}
}
.
これは、すべての図面をホストする1つの宇宙視覚または要素が
public class EllAndRectHost : FrameworkElement
{
private EllipseAndRectangle _ellAndRect = new EllipseAndRectangle();
// EllipseAndRectangle instance is our only visual child
protected override Visual GetVisualChild(int index)
{
return _ellAndRect;
}
protected override int VisualChildrenCount
{
get
{
return 1;
}
}
}
.
そしてこれはあなたがxamlですべてのものを使うことができる方法:
<local:EllAndRectHost Margin="30" ... />
.
私は、100行のビジュアルを作成する代わりに継承することができる描画Visualクラスについて話していました。
あなたの質問に関しては、最初のアプローチは速いです。2番目のアプローチは最後に同じになっているので、最初のものはちょうどうまく包まれています。DrawLine
は最低終了です。DrawLine
より深く進むことはできません。DrawGeometry
はDrawLine
とその他の内部スタッフを呼び出しています。
所属していません StackOverflow