質問

リアルタイムで何百もの線を描くつもりです。これを行うには、 視覚層を選択しました。しかし、ここで行を描くには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より深く進むことはできません。DrawGeometryDrawLineとその他の内部スタッフを呼び出しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top