Вот небольшое повышение, которая вычисляет индекс позиции символа, который находится ближе всего к точке каплепадения. Метод 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;
}
Для уточнения: Намерены ли вы, что если, например, вы имели строку '«California»' в TextBox, и бросил что-то в между '«i'' и '» f'', что он будет вставлять этот объект в индекс 4 поля «Текст»? –
Я использую PreviewDrop и хочу собраться вместе в правильных положениях старого текста с попыткой удалить текст. Да это верно. Я не буду самостоятельно устанавливать значение самостоятельно, я либо установлю DragEventArgs.Handled на true, либо нет. – user565660