You can find attached a sample project, video, demonstrating the steps and a screenshot of the error. Workaround: public class MyMapVisualElementFactory : MapVisualElementFactory { public override MapVisualElement CreatePolyline(Collection<PointG> points) { return new MyMapPolyline(points); } } public class MyMapPolyline : MapPolyline { private FieldInfo pathsField; private FieldInfo boundingRectsField; private FieldInfo isInViewportField; public MyMapPolyline(Collection<PointG> points) : base(points) { this.pathsField = typeof(MapPolyline).GetField("paths", BindingFlags.Instance | BindingFlags.NonPublic); this.boundingRectsField = typeof(MapPolyline).GetField("boundingRects", BindingFlags.Instance | BindingFlags.NonPublic); this.isInViewportField = typeof(MapPolyline).GetField("isInViewport", BindingFlags.Instance | BindingFlags.NonPublic); } public override void ViewportChanged(IMapViewport viewport, ViewportChangeAction action) { if ((action & ViewportChangeAction.All) == action) { long mapSize = MapTileSystemHelper.MapSize(viewport.ZoomLevel); List<GraphicsPath> paths = new List<GraphicsPath>(); List<RectangleL> boundingRects = new List<RectangleL>(); long start = viewport.PanOffset.Width; int maxWraparounds = 1; while (start + mapSize < viewport.ViewportInPixels.Width) { maxWraparounds++; start += mapSize; } for (int i = -1; i <= maxWraparounds; i++) { GraphicsPath path = new GraphicsPath(); List<PointF> drawPoints = new List<PointF>(); foreach (PointG p in this.Points) { PointL pixel = MapTileSystemHelper.LatLongToPixelXY(p.Latitude, p.Longitude, viewport.ZoomLevel); drawPoints.Add(new PointF(pixel.X + i * mapSize, pixel.Y)); } path.AddLines(drawPoints.ToArray()); RectangleF rect = path.GetBounds(); RectangleF view = new RectangleF(viewport.ViewportInPixels.X, viewport.ViewportInPixels.Y, viewport.ViewportInPixels.Width, viewport.ViewportInPixels.Height); if (rect.IntersectsWith(view)) { paths.Add(path); } boundingRects.Add(new RectangleL((long)rect.X, (long)rect.Y, (long)rect.Width, (long)rect.Height)); } this.pathsField.SetValue(this, paths); this.boundingRectsField.SetValue(this, boundingRects); } if (action != ViewportChangeAction.None) { this.isInViewportField.SetValue(this, false); List<RectangleL> boundingRects = this.boundingRectsField.GetValue(this) as List<RectangleL>; foreach (RectangleL rect in boundingRects) { if (viewport.ViewportInPixels.IntersectsWith(rect)) { this.isInViewportField.SetValue(this, true); } } } } } public class MyMapVisualElementFactory : MapVisualElementFactory { public override MapVisualElement CreatePolyline(Collection<PointG> points) { return new MyMapPolyline(points); } } public class MyMapPolyline : MapPolyline { private FieldInfo pathsField; private FieldInfo boundingRectsField; private FieldInfo isInViewportField; public MyMapPolyline(Collection<PointG> points) : base(points) { this.pathsField = typeof(MapPolyline).GetField("paths", BindingFlags.Instance | BindingFlags.NonPublic); this.boundingRectsField = typeof(MapPolyline).GetField("boundingRects", BindingFlags.Instance | BindingFlags.NonPublic); this.isInViewportField = typeof(MapPolyline).GetField("isInViewport", BindingFlags.Instance | BindingFlags.NonPublic); } public override void ViewportChanged(IMapViewport viewport, ViewportChangeAction action) { if ((action & ViewportChangeAction.All) == action) { long mapSize = MapTileSystemHelper.MapSize(viewport.ZoomLevel); List<GraphicsPath> paths = new List<GraphicsPath>(); List<RectangleL> boundingRects = new List<RectangleL>(); long start = viewport.PanOffset.Width; int maxWraparounds = 1; while (start + mapSize < viewport.ViewportInPixels.Width) { maxWraparounds++; start += mapSize; } for (int i = -1; i <= maxWraparounds; i++) { GraphicsPath path = new GraphicsPath(); List<PointF> drawPoints = new List<PointF>(); foreach (PointG p in this.Points) { PointL pixel = MapTileSystemHelper.LatLongToPixelXY(p.Latitude, p.Longitude, viewport.ZoomLevel); drawPoints.Add(new PointF(pixel.X + i * mapSize, pixel.Y)); } path.AddLines(drawPoints.ToArray()); RectangleF rect = path.GetBounds(); RectangleF view = new RectangleF(viewport.ViewportInPixels.X, viewport.ViewportInPixels.Y, viewport.ViewportInPixels.Width, viewport.ViewportInPixels.Height); if (rect.IntersectsWith(view)) { paths.Add(path); } boundingRects.Add(new RectangleL((long)rect.X, (long)rect.Y, (long)rect.Width, (long)rect.Height)); } this.pathsField.SetValue(this, paths); this.boundingRectsField.SetValue(this, boundingRects); } if (action != ViewportChangeAction.None) { this.isInViewportField.SetValue(this, false); List<RectangleL> boundingRects = this.boundingRectsField.GetValue(this) as List<RectangleL>; foreach (RectangleL rect in boundingRects) { if (viewport.ViewportInPixels.IntersectsWith(rect)) { this.isInViewportField.SetValue(this, true); } } } } }