You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF下TextBox.GetLineText()第一行和第二行返回相同文本问题求助

问题原因说明

这个是** .NET 5 版本WPF框架的已知回归bug **,和你自身的配置没有关系,问题根因为自动换行场景下TextBox的行内容索引计算逻辑错误,仅在TextWrapping属性设为Wrap/WrapWithOverflow、且文本无硬换行(回车/换行符)完全靠控件尺寸自动折行时触发。

首先澄清一个正常设计逻辑:LineCount返回的是总行数,GetLineText的索引从0开始计数,3行对应的合法索引仅为0、1、2,你访问索引3抛出ArgumentOutOfRangeException属于正常行为,不属于bug范畴。

可行解决方案
  • 方案1:升级项目目标框架版本。该bug已经在.NET 6的后续补丁版本、以及.NET 7及以上版本中被官方修复,升级后即可直接正常使用GetLineText方法。
  • 方案2:如果必须维持在.NET 5版本,可以通过TextPointerAPI自行计算自动换行的行内容,参考实现代码如下:
public static List<string> GetAutoWrappedLines(TextBox textBox)
{
    List<string> result = new List<string>();
    TextPointer currentPointer = textBox.Document.ContentStart;
    while (currentPointer.CompareTo(textBox.Document.ContentEnd) < 0)
    {
        TextPointer nextLinePointer = currentPointer.GetLineStartPosition(1);
        if (nextLinePointer == null)
        {
            nextLinePointer = textBox.Document.ContentEnd;
        }
        TextRange lineRange = new TextRange(currentPointer, nextLinePointer);
        result.Add(lineRange.Text);
        currentPointer = nextLinePointer;
    }
    return result;
}
  • 方案3:临时规避可以先将TextBox的TextWrapping属性临时设为NoWrap,读取完行内容后再还原为原来的设置,该方案缺点是会触发控件重绘,复杂界面下可能出现短暂闪烁。

内容的提问来源于stack exchange,提问作者dotNET

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 18:06:01