Я использую DragEventArgs для события Drop и располагаю позицию x, y Drop Insert в TextBox.
Как вы конвертируете x, y и Index в TextField? Я очень импонирую, чтобы узнать эту информацию!
Большое спасибо!
Я использую DragEventArgs для события Drop и располагаю позицию x, y Drop Insert в TextBox.
Как вы конвертируете x, y и Index в TextField? Я очень импонирую, чтобы узнать эту информацию!
Большое спасибо!
Вам нужно использовать 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;
}
Вот небольшое усовершенствование, которое вычисляет индекс позиции символа, который ближе всего к точке отбрасывания. Метод 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;
}