首先说一下思路: 先创建一个控件(其实就是一个canvas),在canvas里面生成一条线,给这条线绑定一个PointCollection,在主界面中用一个定时器改变这个PointCollection的值就行了.
1.创建的控件
public partial class BrokenLine : UserControl { public BrokenLine() { InitializeComponent(); this.Loaded += BrokenLine_Loaded; } private Brush mBrushes; private PointCollection coordinatePoints = new PointCollection(); Polyline curvePolyline = new Polyline(); public BrokenLine(PointCollection pointCollection,Brush brushes) { InitializeComponent(); this.Loaded += BrokenLine_Loaded; coordinatePoints = pointCollection; mBrushes = brushes; } private void BrokenLine_Loaded(object sender, RoutedEventArgs e) { curvePolyline = new Polyline(); curvePolyline.Stroke = mBrushes; curvePolyline.StrokeThickness = 1; Canvas.SetLeft(curvePolyline, 5); Canvas.SetTop(curvePolyline, 5); curvePolyline.Points = coordinatePoints; chartCanvas.Children.Add(curvePolyline); } }
2.主界面的代码
BrokenLine xinlv_brokenLine = new BrokenLine(mXL.CoordinatePoints, new SolidColorBrush((Color)ColorConverter.ConvertFromString("#35CD75"))); Canvas.SetTop(xinlv_brokenLine, 20); canvas_TZ.Children.Add(xinlv_brokenLine);
if (points!=null && points.Count>10)///points作为一个缓存集合 { if (points.Count >= 10) { for (int k = 0; k < 10; k++) { CoordinatePoints.Add(points[k]); if (coordinatePoints.Count > mShowLength)//mShowLength控制最多能显示的长度(点的个数) { AddCurvePoint(true, 0.8);//将要显示的点全部向前移动一位 } } points.RemoveRange(0, 10); } else { for (int k = 0; k < points.Count; k++) { CoordinatePoints.Add(points[k]); if (coordinatePoints.Count > mShowLength) { AddCurvePoint(true, 0.8); } } points.Clear(); } }
private void AddCurvePoint(Boolean isMeet, double length) { if (isMeet) { CoordinatePoints.RemoveAt(0); for (int i = 0; i < CoordinatePoints.Count-1; i++) { CoordinatePoints[i] = new Point(CoordinatePoints[i].X - length, CoordinatePoints[i].Y); } CoordinatePoints[coordinatePoints.Count-1] = new Point(CoordinatePoints[coordinatePoints.Count-1].X - length*mX, CoordinatePoints[coordinatePoints.Count - 1].Y); mX++; } }