Question

je vais dessiner des centaines de lignes en temps réel.j'ai choisi le Couche visuelle pour faire ça.Mais je vois qu’il y a deux manières différentes de tracer une ligne ici.Lequel suggérez-vous pour obtenir de meilleures performances et une meilleure vitesse ?

1.DessinContext.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.StreamGéométrie

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;
        }
    }
}
Était-ce utile?

La solution

Comme je l'ai dit, vous n'avez besoin que d'un seul visuel et à l'intérieur vous pouvez avoir toutes vos lignes.

Regarde ça:

Nous définissons d'abord plusieurs dessins dans notre contexte de dessin :

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

Il s'agit d'un visuel ou d'un élément spécifique hébergeant tous les dessins :

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

Et voici comment vous pouvez utiliser toutes ces choses en XAML :

<local:EllAndRectHost Margin="30" ... />

Je parlais de la classe DrawingVisual dont vous pourriez hériter au lieu de créer 100 visuels pour 100 lignes.

Concernant votre question, la première approche est plus rapide.Parce que la deuxième approche fait finalement la même chose, la première est juste bien enveloppée. DrawLine est l'extrémité la plus basse.Tu ne peux pas aller plus loin que DrawLine. DrawGeometry appelle DrawLine et quelques autres trucs internes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top