2017-05-28 5 views
2

Après avoir défini le texte de mon RichTextBox sur la chaîne T, la position du Caret dans le RichTextBox est "perdue" (elle va au début). Voici ce que je fais pour essayer de « restaurer » après qu'il est « perdu »:Comment "restaurer" la position du curseur dans un fichier WTF RichTextBox?

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 

Ce code, cependant, ne fonctionne pas. Le Caret "restauré" se trouve dans une position différente de celle du "original" (toujours derrière le "original" pour une raison quelconque). "Enregistrer" CaretPosition de RichTextBox en tant que TextPointer ne semble pas fonctionner non plus.

Quelqu'un peut-il me fournir une autre façon de «restaurer» le Caret, ou un moyen de corriger le code ci-dessus?

+0

vous récupérez un index et définir une position. selon la documentation, ils ne sont pas les mêmes. essayez d'enregistrer la position du curseur au lieu de l'index du curseur. vous semblez remplacer tout le contenu - à quoi sert-il de restaurer le curseur s'il y a un nouveau texte? surtout, que se passe-t-il si le signe du caret se rapproche de la fin et que le nouveau texte est plus court? – dlatikay

+0

@dlatikay Essayer de sauvegarder CaretPosition en tant que TextPointer fait passer le pointeur "restauré" au début de la RichTextBox. Je remplace tout le contenu d'un système d'annulation/rétablissement (voir: https://stackoverflow.com/questions/15772602/how-to-undo-and-redo-in-c-sharp-rich-text-box) . Pour répondre à votre deuxième question, rien de "différent" ne semble se produire, le signe du caret va juste au Paragraphe au-dessus de la ligne du caret "original", ou remonte quelques caractères. – Polygons

Répondre

2

semble fonctionner (pour moi): C.CaretPosition = C.Document.ContentStart; C.CaretPosition = C.CaretPosition.GetPositionAtOffset(CaretIndex, LogicalDirection.Forward);

(je déteste RichTextBox par le chemin.)

+1

Cela (pour une raison étrange) "fonctionne mieux". J'ai encore des problèmes quand le nouveau texte change la taille du texte, mais je suis sûr que je peux le faire fonctionner avec un peu de jeu (je le posterai dès que je le ferai fonctionner). "_Je déteste RichTextBox en passant._" - vous n'êtes pas le seul. – Polygons