今天在使用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引起的。