2016-10-10 5 views
0

Ich habe eine RichTextBox mit benutzerdefinierter Formatierung für spezielle Textteile darin. Es gibt jedoch einen Fehler, bei dem nach dem Einfügen eines Charakters das Caret vor dem neu eingefügten Zeichen statt nach dem Zeichen platziert wird.Wie kann ich die Caretposition programmatisch in eine RichTextBox verschieben?

Dies liegt daran, für jeden bearbeiten, berechnet der Code den Inhalt der benutzerdefinierten Formatierung und setzt dann die CaretPosition wie so ...

protected override void OnTextChanged(TextChangedEventArgs e) 
    { 
     base.OnTextChanged(e); 

     currentPos = CaretPosition.GetNextInsertionPosition(LogicalDirection.Forward); 

     // Apply special formatting on the content 
     Content = GetContentValue(); 

     if (currentPos != null) 
      CaretPosition = currentPos; 

    } 

Ich bin nicht sicher, wie man sich bewegt den Cursor im Code so anzuwenden dass es NACH dem eingefügten Zeichen erscheint, zB wenn der Originalinhalt "11" ist und ich eine "2" in die Mitte des Textes einfüge, möchte ich, dass das Caret hinter der "2" steht.

Es erscheint derzeit als "1x21" (wobei x das Caret ist). Jede Hilfe wäre willkommen

Antwort

1

Die Position und LogicalDirection, die durch ein TextPointer-Objekt angezeigt werden, sind unveränderlich. Wenn der Inhalt bearbeitet oder geändert wird, ändert sich die Position , die von einem TextPointer angegeben wird, relativ zum umgebenden Text nicht; vielmehr wird der Versatz dieser Position vom Anfang des Inhalts entsprechend angepasst, um die neue relative Position in Inhalt widerzuspiegeln. Beispielsweise zeigt ein TextPointer, der eine Position an dem Anfang eines bestimmten Absatzes anzeigt, weiterhin auf den Anfang von diesen Absatz, auch wenn Inhalt eingefügt oder vor oder nach dem Absatz gelöscht wird. MSDN

Der folgende Code fügt Text auf Button.Click.

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     /* text to insert */    
     string text = "some text"; 

     /* get start pointer */ 
     TextPointer startPtr = Rtb.Document.ContentStart; 

     /* get current caret position */ 
     int start = startPtr.GetOffsetToPosition(Rtb.CaretPosition); 

     /* insert text */ 
     Rtb.CaretPosition.InsertTextInRun(text); 

     /* update caret position */ 
     Rtb.CaretPosition = startPtr.GetPositionAtOffset((start) + text.Length); 

     /* update focus */ 
     Rtb.Focus(); 
    } 
+0

Danke, das erklärt viel! Ich werde versuchen, den Offset für den neuen Inhalt zu verwenden, um die Caret-Position zu verschieben – Tiggy

Verwandte Themen