尝试学习DrawingVisual和StreamGeometry

本文关键字:StreamGeometry DrawingVisual 学习 | 更新日期: 2023-09-27 18:21:36

在我的应用程序中,我必须画一条包含很多点的线(如果需要,最多100000点)。最初我使用了多段线,但对于大量的点来说,这太慢了。

我一直在读一些书,后来学习了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添加到画布中。

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

其中"ActieveCanvas"是画布。

仅供参考:所有点都是画布内(相对于画布)的X、Y坐标。

我做错了什么?

尝试学习DrawingVisual和StreamGeometry

通过更改以下修复了它

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