Как преобразовать Xy позицию в TextBox в текстовый индекс?

Я использую DragEventArgs для события Drop и располагаю позицию x, y Drop Insert в TextBox.

Как вы конвертируете x, y и Index в TextField? Я очень импонирую, чтобы узнать эту информацию!

Большое спасибо!

Ответ 1

Вам нужно использовать GetCharacterIndexFromPoint метод TextBox:

void textBox1_Drop(object sender, DragEventArgs e)
{
    TextBox textBox = (TextBox)sender;
    Point position = e.GetPosition(textBox);
    int index = textBox.GetCharacterIndexFromPoint(position, true);
    string text = (string)e.Data.GetData(typeof(string));
    textBox.SelectionStart = index;
    textBox.SelectionLength = 0;
    textBox.SelectedText = text;
}

Ответ 2

Вот небольшое усовершенствование, которое вычисляет индекс позиции символа, который ближе всего к точке отбрасывания. Метод GetCharacterIndexFromPoint фактически не возвращает позицию ближайшего char (как и документально), но возвращает индекс символа который находится в точке сброса (даже если выпавшая точка находится справа от правого края char, и в этом случае метод должен вернуть индекс следующего char, который фактически ближе к точке отбрасывания).

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;
}