public void Draw(TextView textView, DrawingContext drawingContext) { var typeface = textView.GetValue(TextBlock.FontFamilyProperty); var emSize = textView.GetValue(TextBlock.FontSizeProperty); var formattedText = TextFormatterFactory.CreateFormattedText( textView, "9", typeface, emSize, Brushes.Black ); var charSize = formattedText.Measure(); var pixelSize = PixelSnapHelpers.GetPixelSize(textView); foreach (var entry in markers.Where(e => e.Length > 0)) { if (entry.StartOffset <= textView.Document.TextLength) { var startLine = textView.Document.GetLineByOffset(entry.StartOffset); var start = entry.StartOffset; var startChar = textView.Document.GetCharAt(startLine.Offset); if (char.IsWhiteSpace(startChar)) { start = TextUtilities.GetNextCaretPosition(textView.Document, startLine.Offset, LogicalDirection.Forward, CaretPositioningMode.WordBorder); } var endLine = textView.Document.GetLineByOffset(entry.EndOffset <= textView.Document.TextLength ? entry.EndOffset : textView.Document.TextLength); if (endLine.EndOffset > start && startLine != endLine) { var newEntry = new TextSegment() { StartOffset = start, EndOffset = endLine.EndOffset }; var rects = BackgroundGeometryBuilder.GetRectsForSegment(textView, newEntry); var rect = GetRectForRange(rects); if (!rect.IsEmpty) { var startColumn = textView.Document.GetLocation(newEntry.StartOffset).Column - 1; var endColumn = textView.Document.GetLocation(newEntry.EndOffset).Column - 2; var xPos = charSize.Width * Math.Min(startColumn, endColumn); rect = rect.WithX(xPos + (charSize.Width / 2)); rect = rect.WithX(PixelSnapHelpers.PixelAlign(rect.X, pixelSize.Width)); rect = rect.WithY(PixelSnapHelpers.PixelAlign(rect.Y, pixelSize.Height)); drawingContext.DrawLine(_pen, rect.TopLeft, rect.BottomLeft); } } } } }