Вот небольшое улучшение, которое вычисляет индекс позиции персонажа, который находится ближе всего к точке сброса. Метод GetCharacterIndexFromPoint на самом деле не возвращает позицию ближайшего символа (как это задокументировано), но возвращает индекс символа, который находится ниже точки отбрасывания (даже если точка отбрасывания находится рядом с правый край символа, в этом случае метод должен возвращать индекс следующего символа, который фактически ближе к точке сброса).
private int GetRoundedCharacterIndexFromPoint(TextBox textBox, Point dropPoint)
{
int position = textBox.GetCharacterIndexFromPoint(dropPoint, true);
// Check if the dropped point is actually closer to the next character
// or if it exceeds the righmost character in the textbox
// (in this case increase position by 1)
Rect charLeftEdge = textBox.GetRectFromCharacterIndex(position, false);
Rect charRightEdge = textBox.GetRectFromCharacterIndex(position, true);
double charWidth = charRightEdge.X - charLeftEdge.X;
if (dropPoint.X + charWidth / 2 > charRightEdge.X) position++;
return position;
}