试图学习DrawingVisual和StreamGeometry

时间:2015-11-12 14:08:01

标签: c# wpf canvas drawing drawingvisual

在我的应用程序中,我必须绘制一条包含许多点的行(如果需要,最多可达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 });

“ActieveCanvas”是画布。

有关信息:所有点都是画布内(相对于)的X,Y坐标。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

通过更改以下内容来修复它

            if (PuntenCollectie.IndexOf(Punt).Equals(0))
            {
                cr.BeginFigure(Punt, false, false);
            }
            else
            {
                cr.LineTo(Punt, false, false);
            }

            if (PuntenCollectie.IndexOf(Punt).Equals(0))
            {
                cr.BeginFigure(Punt, true, false);
            }
            else
            {
                cr.LineTo(Punt, true, false);
            }