Рисование визуала в 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
без успеха