0

私のアプリケーションでは、多くのポイント (必要に応じて最大 100.000) を含む線を描画する必要があります。最初はポリラインを使用しましたが、これはポイントの数が多い場合には遅すぎることが判明しました。

私はいくつか読んでいて、DrawingVisual と StreamGeometry に来ましたが、うまくいきません。

簡単なチュートリアルに従って、次のクラスを作成しました。

class ConcentratieGrafiek : FrameworkElement
{
    VisualCollection Visuals;
    PointCollection PuntenCollectie;

    public ConcentratieGrafiek(PointCollection Punten)
    {
        Visuals = new VisualCollection(this);
        PuntenCollectie = Punten;

        this.Loaded += new RoutedEventHandler(ConcentratieGrafiekLoaded);
    }

    void ConcentratieGrafiekLoaded(object sender, RoutedEventArgs e)
    {
        DrawingVisual Visual = new DrawingVisual();

        StreamGeometry g = new StreamGeometry();
        using (StreamGeometryContext cr = g.Open())
        {
            foreach (Point Punt in PuntenCollectie)
            {
                if (PuntenCollectie.IndexOf(Punt).Equals(0))
                {
                    cr.BeginFigure(Punt, false, false);
                }
                else
                {
                    cr.LineTo(Punt, false, false);
                }
            }
        }

        using (DrawingContext dc = Visual.RenderOpen())
        {
            Pen p = new Pen(Brushes.Black, 1);
            dc.DrawGeometry(Brushes.Black, p, g);
        }

        Visuals.Add(Visual);
    }

    protected override Visual GetVisualChild(int index)
    {
        return Visuals[index];
    }

    protected override int VisualChildrenCount
    {
        get
        {
            return Visuals.Count;
        }
    }
}

必要な線のすべてのポイントは、Punten という PointCollection にあります。次に、この FrameworkElement を使用して Canvas に追加しようとします。

ActieveCanvas.Children.Add(new ConcentratieGrafiek(ConcentratiePunten) { HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Stretch });

「ActiveveCanvas」はキャンバスです。

情報: すべての点は、キャンバス内の (相対的な) X、Y 座標です。

私は何を間違っていますか?

4

1 に答える 1