Wpf 如何将文本框中的X y位置转换为文本索引?

Wpf 如何将文本框中的X y位置转换为文本索引?,wpf,Wpf,我将DragEventArgs用于Drop事件,并将x、y Drop插入位置置于文本框中 如何将x、y转换为TextField中的和索引? 我发现这个信息对我来说非常重要 多谢各位 您需要使用文本框的方法: void textBox1_Drop(object sender, DragEventArgs e) { TextBox textBox = (TextBox)sender; Point position = e.GetPosition(textBox); int i

我将DragEventArgs用于Drop事件,并将x、y Drop插入位置置于文本框中

如何将x、y转换为TextField中的和索引? 我发现这个信息对我来说非常重要

多谢各位

您需要使用
文本框的方法:

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

这是一个小的增强功能,它可以计算最靠近放置点的角色的位置索引。该方法实际上不返回最近字符的位置(如文档所述),但返回位于删除点下的字符的索引(即使删除的点正好位于字符右边缘的旁边,在这种情况下,该方法也应该返回下一个字符的索引,而下一个字符实际上更接近删除点)

private int GetRoundedCharacterIndexFromPoint(文本框文本框,点dropPoint)
{
int position=textBox.GetCharacterIndexFromPoint(dropPoint,true);
//检查丢弃的点是否实际上更接近下一个字符
//或者如果超过文本框中的righmost字符
//(在这种情况下,将位置增加1)
Rect charLeftEdge=textBox.GetRectFromCharacterIndex(位置,false);
Rect charRightEdge=textBox.GetRectFromCharacterIndex(位置,true);
double charWidth=charRightEdge.X-charLeftEdge.X;
如果(dropPoint.X+charWidth/2>charRightEdge.X)位置++;
返回位置;
}

澄清:您是否打算,例如,如果您有字符串“California”
在文本框中,并在
'i'
'f'
之间放置了一些东西,它将在文本字段的索引4处插入该对象?我正在使用PreviewDrop,并希望将旧文本与尝试放置的文本放在正确的位置。是的,这是正确的。我不会自行设置值,我会要么将DragEventArgs.Handled设置为true,要么不设置。非常感谢您的响应。我尝试了代码,GetCharacterIndexFromPoint始终返回-1,要么找不到。是否需要进行某种偏移?@user565660,我意识到我忘记了上面代码中的
snapToText
参数(我已修复了它)。如果传递此参数的
true
,您是否仍然得到-1?
位置的值是多少?您不需要偏移量,因为该位置已经相对于
文本框
(如调用
GetPosition
中指定的)