Wow. I was soooo wrong. TextBoxBase isn't low hanging fruit. Microsoft messed up the access levels once again! One of the most fundamental concepts of any TextBox type is selection. In fact, TextBoxBase exposes a lot of concepts based around this, like a SelectionChanged event, AutoWordSelection and Cut/Copy/Paste based on the selection. However, there's no way to determine what the selection is!
TextBox and RichTextBox aren't consistent in how they expose the selection. TextBox exposes SelectionStart and SelectionEnd while RichTextBox exposes a Selection. That's wacky enough to be highly questionable to me. Just bad design. But what's worse is that all of these methods are implemented in terms of a TextSelectionInternal on the base TextBoxBase, which, like the name indicates, is internal! How did this design pass code review?
There's no way to base behaviors here on TextBoxBase. If I cared about RichTextBox I'd have to provide two separate implementations (at least partially... I can envision a few ways to hack around this in order to reuse at least some of the behavioral code). Then again, there's other issues with masking a RichTextBox (there's no simple Text concept, for example), and I really don't care to do so, so there's not too much reason to care about this in this case. However, that doesn't make the Selection issue on TextBoxBase any less forgivable, IMHO.