2011-01-06 4 views
2

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

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

спасибо!

+1

Для уточнения: Намерены ли вы, что если, например, вы имели строку '«California»' в TextBox, и бросил что-то в между '«i'' и '» f'', что он будет вставлять этот объект в индекс 4 поля «Текст»? –

+0

Я использую PreviewDrop и хочу собраться вместе в правильных положениях старого текста с попыткой удалить текст. Да это верно. Я не буду самостоятельно устанавливать значение самостоятельно, я либо установлю DragEventArgs.Handled на true, либо нет. – user565660

ответ

3

Вы должны использовать 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; 
} 
+0

Большое спасибо за ответ. Я попробовал код, и GetCharacterIndexFromPoint всегда возвращает -1 или он не смог его найти. Есть ли какое-то смещение, которое вам нужно сделать? – user565660

+0

@ user565660, я понимаю, что забыл параметр 'snapToText' в коде выше (я его исправил). Вы все еще получаете -1, если вы передаете 'true' для этого параметра? Какова ценность 'position'? Вам не требуется смещение, потому что позиция уже относится к 'TextBox' (как указано в вызове' GetPosition') –

3

Вот небольшое повышение, которая вычисляет индекс позиции символа, который находится ближе всего к точке каплепадения. Метод 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; 
} 
Смежные вопросы