[quote user="Bruce Reeves SRNS"]I've looked at RunRange, but can't figure our how to "get" one.[/quote]
I agree. The text API is well obfuscated. We could do with more examples.
RunRange Construction
You can construct a RunRange from a TextBlock or a Start Caret/End Caret pair...
RunRange rr1 (textBlock); // Creates a range of all runs in the given TextBlock. RunRange rr2 (startCaret, endCaret); // Creates a range of all runs between the two Carets, inclusive on both ends
It's a non-copyable class, meaning that you can't assign it and you can't use it in a standard container.
However, you can obtain a RunIterator from a RunRange. That will let you iterate a range between two carets without needing a standard container.