wpf GetPositionAtOffset移动位置错误

本文探讨了使用GetPositionAtOffset方法时遇到的光标位置偏移问题,并通过详细实验记录揭示了Run元素对光标位置的影响规律,最终提出了一种利用GetNextInsertionPosition方法的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在使用GetPositionAtOffset 方法时,发现位置总是移动的不对,记录如下:

首先是初始化richtextbox

   string str1 = "@aaa";
            string str2 = "_m";
            Run run = new Run(str1, richTextbox.Selection.Start);
            richTextbox.CaretPosition = run.ContentEnd;
            Run run2 = new Run(str2,richTextbox.Selection.Start);
            richTextbox.CaretPosition = run2.ContentEnd;
输出一下
   var range = new TextRange(richTextbox.CaretPosition.DocumentStart, richTextbox.CaretPosition);
            string txt = range.Text;
            txt4.Text = txt.Replace('\r', 'r').Replace('\n', 'n');//@aaa_m
            range = new TextRange(richTextbox.CaretPosition, richTextbox.CaretPosition.DocumentEnd);
            string txt222 = range.Text;
            txt5.Text = txt222.Replace('\r', 'r').Replace('\n', 'n');//rn

现在我们将光标向前移动6个位置

  TextPointer tp0 = richTextbox.CaretPosition.GetPositionAtOffset(-6);
                        richTextbox.CaretPosition = tp0;

在输出 发现为 @a 和 aa_m 并不是期望中的  空 和@aaa_m

查了半天,最后发现每增加一个Run 貌似增加了2个字符的占位符,将richtextbox在加一个Run

            Run run3 = new Run(str2, richTextbox.Selection.Start);
            richTextbox.CaretPosition = run3.ContentEnd;

然后做个测试

 TextPointer temp = richTextbox.CaretPosition;
                        for (int i = 1; i < 20; i++)
                        {

                            richTextbox.CaretPosition = temp;
                            TextPointer tp0 = richTextbox.CaretPosition.GetPositionAtOffset(-i);
                            richTextbox.CaretPosition = tp0;
                            Console.Write(-i);
                            Console.Write(" " );                           
                            var range1 = new TextRange(richTextbox.CaretPosition.DocumentStart, richTextbox.CaretPosition);
                            txt2.Text = range1.Text;
                            Console.Write(txt2.Text);
                            Console.Write("         ");
                            var range2 = new TextRange(richTextbox.CaretPosition, richTextbox.CaretPosition.DocumentEnd);
                            txt3.Text = range2.Text.Replace('\r', 'r').Replace('\n', 'n');
                            Console.WriteLine(txt3.Text);
                        }

输出

-1 @aaa_m_         mrn
-2 @aaa_m         _mrn
-3 @aaa_m         _mrn
-4 @aaa_m         _mrn
-5 @aaa_         m_mrn
-6 @aaa         _m_mrn
-7 @aaa         _m_mrn
-8 @aaa         _m_mrn
-9 @aa         a_m_mrn
-10 @a         aa_m_mrn
-11 @         aaa_m_mrn
-12          @aaa_m_mrn
-13          @aaa_m_mrn
-14          @aaa_m_mrn

现在,猜测Run 在开头处插入两个字符的标识符。

解决方案:利用GetNextInsertionPosition解决,暂时没找到别的方案。

                        TextPointer tp11 = richTextbox.CaretPosition;
                        for (int i = 0; i > t; i--)
                        {
                            tp11 = tp11.GetNextInsertionPosition(LogicalDirection.Backward);
                            if (tp11 == null)
                                return;
                        }
                        richTextbox.CaretPosition = tp11;

其他怀疑过的问题:

在实际中,我刚开始怀疑是字符串中的空格引起的。正常的空格ascii为32 ,但是我输出了下,我的字符串中ascii为160。

还有怀疑过是 字符串末尾的/r/n引起的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值