Я использую 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;
}