在RichTextBox C#WPF中设置卡雷特位置

在RichTextBox C#WPF中设置卡雷特位置,c#,wpf,richtextbox,rtf,C#,Wpf,Richtextbox,Rtf,我有一个RichTextBox和Name=Editor!以及以下代码: String textRich = new TextRange(Editor.Document.ContentStart, Editor.Document.ContentEnd).Text; EditorColor ec = new EditorColor(textRich);//Transform The text in RTF Text Stream stream = new MemorySt

我有一个
RichTextBox
Name=Editor
!以及以下代码:

 String textRich = new TextRange(Editor.Document.ContentStart, Editor.Document.ContentEnd).Text;           
 EditorColor ec = new EditorColor(textRich);//Transform The text in RTF Text
 Stream stream = new MemoryStream(ASCIIEncoding.Default.GetBytes(ec.SetText())); //SetText Function return a RTF text
 Editor.Selection.Select(Editor.Document.ContentStart, Editor.Document.ContentEnd);
 Editor.Document.Blocks.Clear();
 Editor.Selection.Load(stream, DataFormats.Rtf);//Change the text with the RTF Text
 Editor.CaretPosition = ???? 
我想将
Editor.CaretPosition
设置为我选择并更改文本之前的状态?在这里不起作用:

 TextPointer carret = Editor.CaretPosition;
 do above code ......
 Editor.CaretPosition = carret; // it sets the carret at end of Richtextbox 

那么如何做到这一点呢?

如果您的纯文本被转换为格式化文本,那么这应该是可行的:

 // Save the current position
 int caretIntPosition = GetIntPosition(Editor.CaretPosition, Editor);

 // Do your work ...

 // Restore the position
 SetIntPosition(caretIntPosition, Editor);

 /// <summary>
 /// Converts a TextPointer position into an int position.
 /// </summary>
 int GetIntPosition(TextPointer pointerPosition, RichTextBox rtb)
 {
     int intPosition = 0;

     TextPointer currentPosition = rtb.Document.ContentStart;

     while (currentPosition.CompareTo(pointerPosition) != 0)
     {
         intPosition++;

         currentPosition = currentPosition.GetNextInsertionPosition(LogicalDirection.Forward);
     }

     return intPosition;
 }

 /// <summary>
 /// Converts an int position back into a TextPointer position and places the caret there.
 /// </summary>
 void SetIntPosition(int intPosition, RichTextBox rtb)
 {
     TextPointer currentPosition = rtb.Document.ContentStart;

     for (int i = 1; i <= intPosition; i++)
     {
         currentPosition = currentPosition.GetNextInsertionPosition(LogicalDirection.Forward);
     }

     rtb.CaretPosition = currentPosition;
 }
//保存当前位置
int caretIntPosition=GetIntPosition(Editor.CaretPosition,Editor);
//做你的工作。。。
//复职
SetIntPosition(caretIntPosition,编辑器);
/// 
///将文本指针位置转换为int位置。
/// 
int GetIntPosition(文本指针指针位置,RichTextBox rtb)
{
int位置=0;
text指针currentPosition=rtb.Document.ContentStart;
while(currentPosition.CompareTo(pointerPosition)!=0)
{
intPosition++;
currentPosition=currentPosition.GetNextInsertionPosition(LogicalDirection.Forward);
}
返回位置;
}
/// 
///将int位置转换回TextPointer位置,并将插入符号放在该位置。
/// 
void SetIntPosition(int intPosition,RichTextBox rtb)
{
text指针currentPosition=rtb.Document.ContentStart;

对于(int i=1;i,如果将纯文本转换为格式化文本,则此操作应有效:

 // Save the current position
 int caretIntPosition = GetIntPosition(Editor.CaretPosition, Editor);

 // Do your work ...

 // Restore the position
 SetIntPosition(caretIntPosition, Editor);

 /// <summary>
 /// Converts a TextPointer position into an int position.
 /// </summary>
 int GetIntPosition(TextPointer pointerPosition, RichTextBox rtb)
 {
     int intPosition = 0;

     TextPointer currentPosition = rtb.Document.ContentStart;

     while (currentPosition.CompareTo(pointerPosition) != 0)
     {
         intPosition++;

         currentPosition = currentPosition.GetNextInsertionPosition(LogicalDirection.Forward);
     }

     return intPosition;
 }

 /// <summary>
 /// Converts an int position back into a TextPointer position and places the caret there.
 /// </summary>
 void SetIntPosition(int intPosition, RichTextBox rtb)
 {
     TextPointer currentPosition = rtb.Document.ContentStart;

     for (int i = 1; i <= intPosition; i++)
     {
         currentPosition = currentPosition.GetNextInsertionPosition(LogicalDirection.Forward);
     }

     rtb.CaretPosition = currentPosition;
 }
//保存当前位置
int caretIntPosition=GetIntPosition(Editor.CaretPosition,Editor);
//做你的工作。。。
//复职
SetIntPosition(caretIntPosition,编辑器);
/// 
///将文本指针位置转换为int位置。
/// 
int GetIntPosition(文本指针指针位置,RichTextBox rtb)
{
int位置=0;
text指针currentPosition=rtb.Document.ContentStart;
while(currentPosition.CompareTo(pointerPosition)!=0)
{
intPosition++;
currentPosition=currentPosition.GetNextInsertionPosition(LogicalDirection.Forward);
}
返回位置;
}
/// 
///将int位置转换回TextPointer位置,并将插入符号放在该位置。
/// 
void SetIntPosition(int intPosition,RichTextBox rtb)
{
text指针currentPosition=rtb.Document.ContentStart;

对于(int i=1;i TextPointer是一种引用类型,因此当您更改CaretPosition时,yout
carret
变量也会更改。您需要复制,而不是引用。TextPointer是一种引用类型,因此当您更改CaretPosition时,yout
carret
变量也会更改。您需要复制,而不是引用。请查看我更改的ans请看我修改过的答案。