获取WPF文本框的行和列位置

获取WPF文本框的行和列位置,wpf,textbox,Wpf,Textbox,我一直在搜索,这里的解决方案用于获取WPF文本框中光标的行和列位置,直到行号大于16311。之后,该列为负值 private void SetTextFileCursorPosition() { var caretIndex = TextFile.CaretIndex; var row = TextFile.GetLineIndexFromCharacterIndex(caretIndex); var col = caretInde

我一直在搜索,这里的解决方案用于获取WPF文本框中光标的行和列位置,直到行号大于16311。之后,该列为负值

    private void SetTextFileCursorPosition()
    {
        var caretIndex = TextFile.CaretIndex;
        var row = TextFile.GetLineIndexFromCharacterIndex(caretIndex);
        var col = caretIndex - TextFile.GetCharacterIndexFromLineIndex(row);
        CursorPosition = $"{col + 1}, {row + 1}";
    }

非常奇怪的行为。即使翻遍了.NET源代码,我也不太清楚为什么会发生这种情况。我花了一些时间来写我的研究,并将其作为.NET框架中的一个bug提交

以下是错误报告的链接:

但我会总结一下我的发现:

我的经历和你的有点不同。在我的测试中,一切正常,直到我到达8512行。从该行开始
GetCharacterIndexFromLineIndex
似乎开始返回下一行的起始索引,而不是所请求的索引。也就是说,它没有给我8512的开头,而是给了我8513的开头

在使用大量行进行测试时,我发现在第25536行,
GetCharacterIndexFromLineIndex
开始跳过两行,而不是返回第25538行的开头。在第42560行,跳过的行数增加到3,然后在第59584行增加到4

这揭示了一种模式:每17024行,跳过的行数增加1。模式从第8512行开始,因为它是17024/2(一半)

我无法解释为什么会发生这种情况,但上面提供了一些关于这种行为的良好文档。下面,我整理了一些代码来解决这个问题

您可以通过以下方式解决此问题:

var caretIndex = TextFile.CaretIndex;
var line = TextFile.GetLineIndexFromCharacterIndex(caretIndex);
var colStart = TextFile.GetCharacterIndexFromLineIndex(line);
var pos = caretIndex - colStart;

int posAdj = pos;
int lineAdj = line;

while (posAdj < 0)
{
    posAdj = TextFile.GetLineLength(lineAdj) + posAdj;
    lineAdj--;
}

CursorPosition = $"{posAdj + 1}, {line + 1}"; //NOT lineAdj
var caretIndex=TextFile.caretIndex;
var line=TextFile.GetLineIndexFromCharacterIndex(caretIndex);
var colStart=TextFile.GetCharacterIndexFromLineIndex(行);
var pos=caretIndex-colStart;
int posAdj=pos;
int lineAdj=直线;
while(posAdj<0)
{
posAdj=TextFile.GetLineLength(lineAdj)+posAdj;
线性dj--;
}
游标位置=$“{posAdj+1},{line+1}”//不是线性的

上面的代码会增加前几行的长度,直到达到正值,从而有效地增加跳过的行。无论文本有多长,它都应该工作,甚至应该在他们(希望)修补错误后继续工作(从那时起,
pos
永远不应该是
<0
)。

如果您指的是多行文本框控件,在什么条件下您会允许数据超过16311行的内容,更不用说在文本框中显示一本小小说的专栏了。您真正需要行/列的目的是什么?我正在开发一个数据查看器,用于下载到我公司的零售商店。在某些情况下,下载的文件包含数十万行。我想显示控件中光标的行/列位置。您在应用程序中使用的字体和字号是什么?我想知道这是否对事情有任何影响。我给用户一个增加或减少字体大小的选项,但使用Courier New作为字体系列,因为它需要是单空间字体。我将用不同的大小测试您的最新解决方案,并确保它仍然有效。我确认,当字体大小小于10时,字体大小与列位置不一致,并且根据字体大小在不同点发生错误。只要字体大小>=10,就可以正常工作。在补丁发布之前,我将把它作为一个已知问题放在这个应用程序中。谢谢你的回复,但这并没有解决问题,只是移动了它。该问题现在出现在第48936行,即之前的位置*3.00018。caretIndex=2152803;row=48936;col=-88@KeithR我已经更新了我的答案,在花了比我想象的更多的时间之后。这绝对是个错误。有趣的是,我的手机从8512行开始跳过一行,然后从25536行开始跳过两行,这正好是后来的3倍。如果您从发生错误的第一行开始,而不是从最后一行开始,那么实际上您的也是3倍。@KeithR好的,这应该是最后一次更新。我现在提供的代码应该总是输出正确的插入符号位置。谢谢Keith。这似乎奏效了。你是最棒的@基思不客气,从一个基思到另一个基思。另外,如果你真的想修复这个bug,你应该去我链接的bug报告并投票表决。