public static IEnumerable<TextRunLine> ToLines( Paragraph para, int maxwidth ) { int length = para.Length; var start = new ParagraphIterator() { Paragraph = para }; if ( !start.TryFindAdvance((ch)=>ch!=' ') ) yield break; var end = start; end.TryFindAdvance((ch)=>ch==' '); start.Rewind(); for (;;) { bool createline = false; if ( end.Run >= para.Runs ) createline = true; if (!createline) { var possibleend = end; possibleend.TryFindAdvance((ch)=>ch!=' '); possibleend.TryFindAdvance((ch)=>ch==' '); if ( MeasureLine(start,possibleend).Bounds.Width > maxwidth ) { createline = true; } else { end = possibleend; continue; } } if (createline) { yield return new TextRunLine(start,end); if ( end.Run >= para.Runs ) yield break; start = end; start.TryFindAdvance((ch)=>ch!=' '); if ( start.Run >= para.Runs ) yield break; end = start; end.TryFindAdvance((ch)=>ch==' '); } } }