Рисование визуала в WPF точечной диаграмме

Я играю с рисованием визуалов и могу успешно создавать собственные объекты (например, точки, кресты или даже звезды) и рисовать их на холсте. Моя цель - связать точечный график с массивом и обновить положение точек, которые изменились. Но я хочу, чтобы вся диаграмма была в одном визуальном объекте, зависящем от массива. Я попробовал это:

public class PointsDrawing : DrawingVisual
{
    private GeometryGroup s1group = new GeometryGroup();
    private PathGeometry stripePath = new PathGeometry();

    private MediaBrush _color = Brushes.Red;
    private int _size = 2;

    public PointsDrawing(int[] pointsArray,int size, MediaBrush color)
    {
        _color = color;
        _size = size;
        using (DrawingContext dc = RenderOpen())
        {

            for (int x = 0; x < pointsArray.Length; x++)
            {
                s1group.Children.Add(new EllipseGeometry(new PointXY(x, pointsArray[x]), _size, _size));
            }

            stripePath.AddGeometry(s1group);
            dc.DrawGeometry(Brushes.Transparent, new Pen(_color, _size), stripePath);
        }
    }

    public void Set(int[] pointsArray)
    {
        s1group.Children.Clear();

        using (DrawingContext dc = RenderOpen())
        {
            for (int x = 0; x < pointsArray.Length; x++)
            {
                s1group.Children.Add(new EllipseGeometry(new Point(x, pointsArray[x]), _size, _size));
            }

            stripePath.AddGeometry(s1group);
           dc.DrawGeometry(Brushes.Transparent, new Pen(_color, _size), stripePath);
        }

    }
}

public class StripeUIElement : FrameworkElement
{
    private PointsDrawing _pointsStripe;
    private MediaBrush _color = Brushes.Red;
    private int _size = 2;

    public StripeUIElement(int[] pointsArray, int pointSize, MediaBrush pointColor)
    {
        _color = pointColor;
        _size = pointSize;
        _pointsStripe = new PointsDrawing(pointsArray, _size , _color );
    }

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

    protected override int VisualChildrenCount
    {
        get
        {
            return 1;
        }
    }

    public void Update(int[] pointsArray)
    {
        _pointsStripe = new PointsDrawing(pointsArray, _size, _color);
    }
}

И тогда я звоню:

stripe = new StripeUIElement(new int[200], 1, Brushes.Red);
canvas1.Children.Add(stripe);

Код выше фактически создает линию из точек, но вызов метода stripe.Update не обновляет холст. Я также пытался заставить canvas.InvalidateVisual без успеха

0 ответов

Другие вопросы по тегам