2017-05-28 1 views
2

Nachdem ich den Text meiner RichTextBox auf die Zeichenfolge T gesetzt habe, ist die Caret-Position in der RichTextBox "verloren" (sie geht an den Anfang). Hier ist, was ich tue, es zu versuchen, „wiederherstellen“, nachdem er „verloren“:Wie kann ich die Caret-Position in einer Wpf RichTextBox "wiederherstellen"?

public static int GetCaretIndex(RichTextBox C) 
{ 
    return new TextRange(C.Document.ContentStart, C.CaretPosition).Text.Length; 
} 
... 
int CaretIndex = GetCaretIndex(C); // Get the Caret position before setting the text of the RichTextBox 
new TextRange(C.Document.ContentStart, C.Document.ContentEnd).Text = T; // Set the text of the RichTextBox 
C.CaretPosition = C.Document.ContentStart.GetPositionAtOffset(CaretIndex, LogicalDirection.Forward); // Set the Caret Position based on the "Caret Index" variable 

Dieser Code jedoch nicht funktioniert. Der "wiederhergestellte" Caret befindet sich an einer anderen Position als der "ursprüngliche" (aus irgendeinem Grund immer hinter dem "ursprünglichen").

"Speichern" der CaretPosition der RichTextBox als TextPointer scheint auch nicht zu funktionieren.

Kann mir jemand eine alternative Möglichkeit zur "Wiederherstellung" des Caret zur Verfügung stellen, oder eine Möglichkeit, den obigen Code zu reparieren?

+0

Sie einen Index abgerufen werden und eine Position gesetzt. Laut Dokumentation sind sie nicht gleich. Versuchen Sie, die Caret-Position anstelle des Caret-Indexes zu speichern. Du scheinst den ganzen Inhalt zu ersetzen - was ist der Sinn der Wiederherstellung des Caret, wenn es neuen Text gibt? Vor allem, was sollte passieren, wenn der Caret am Ende des Films fast fertig war und der neue Text kürzer ist? – dlatikay

+0

@dlatikay Wenn versucht wird, die CaretPosition als TextPointer zu speichern, wird der "wiederhergestellte" Zeiger an den Anfang der RichTextBox gesetzt. Ich ersetze den gesamten Inhalt für ein Undo/Redo-System (siehe: https://stackoverflow.com/questions/15772602/how-to-undo-and-redo-in-c-sharp-rich-text-box) . Um deine zweite Frage zu beantworten, scheint nichts "anderes" zu passieren, der Caret geht einfach über die "originale" Caret-Zeile zum Absatz, oder geht ein paar Zeichen zurück. – Polygons

Antwort

2

scheint (für mich) zu arbeiten: C.CaretPosition = C.Document.ContentStart; C.CaretPosition = C.CaretPosition.GetPositionAtOffset(CaretIndex, LogicalDirection.Forward);

(I RichTextBox von der Art und Weise hassen.)

+1

Das (aus irgendeinem seltsamen Grund) "funktioniert besser". Ich habe immer noch Probleme, wenn der neue Text die Textgröße ändert, aber ich bin mir ziemlich sicher, dass ich mit etwas herumspielen es funktionieren lassen kann (wird es hier veröffentlichen, sobald ich es funktioniere). "_Ich hasse RichTextBox übrigens._" - Sie sind nicht der einzige. – Polygons

Verwandte Themen