public void Draw(TextView textView, DrawingContext drawingContext) { if (!markers.Any() || !textView.VisualLinesValid) { return; } var visualLines = textView.VisualLines; if (visualLines.Count == 0) { return; } int viewStart = visualLines.First().FirstDocumentLine.Offset; int viewEnd = visualLines.Last().LastDocumentLine.EndOffset; foreach (ErrorTextMarker marker in markers.FindOverlappingSegments(viewStart, viewEnd - viewStart)) { foreach (Rect rect in BackgroundGeometryBuilder.GetRectsForSegment(textView, marker)) { Point startPoint = rect.BottomLeft; Point endPoint = rect.BottomRight; var pen = new Pen(new SolidColorBrush(marker.MarkerColor), 1); pen.Freeze(); const double offset = 2.5; int count = Math.Max((int)((endPoint.X - startPoint.X) / offset) + 1, 4); var geometry = new StreamGeometry(); using (StreamGeometryContext ctx = geometry.Open()) { ctx.BeginFigure(startPoint, false, false); ctx.PolyLineTo(CreatePoints(startPoint, offset, count).ToArray(), true, false); } geometry.Freeze(); drawingContext.DrawGeometry(Brushes.Transparent, pen, geometry); break; } } }