9 votes

Comment déplacer le curseur d'un certain nombre de positions dans une RichTextBox WPF ?

Je veux déplacer le signe d'insertion de 4 positions à droite de l'endroit où se trouve actuellement mon signe d'insertion. Je suis inscrit pour PreviewKeyDown et en appelant InsertTextInRun() lorsque la touche de tabulation est capturée, comme ceci :

private void rtb_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Tab)
    {
        rtb.CaretPosition.InsertTextInRun("    ");
        e.Handled = true;
    }
}

Le problème est que le signe d'insertion reste en place après l'appel à la fonction InsertTextInRun() . Il ne no se déplace à la fin du nouveau texte, ce qui est le comportement que je souhaite. Comment dois-je faire ?


Soit dit en passant, oui, je suis au courant des AcceptsTab la propriété sur RichTextBox . J'ai choisi de l'ignorer et de mettre en place ma propre fonctionnalité de tabulation car la tabulation avec AcceptsTab a pour effet secondaire désagréable d'indenter le texte sur les lignes suivantes, qui est no ce que je veux.

9voto

DK. Points 1543

Je viens de rencontrer le même problème. Il semble que la position finale du caret dépende de la direction dans laquelle il se déplaçait juste avant l'insertion.

Le code suivant s'assure (3.5sp1) qu'après l'insertion, le curseur sera à droite du texte inséré :

 rtb.CaretPosition = rtb.CaretPosition.GetPositionAtOffset(0, LogicalDirection.Forward);
rtb.CaretPosition.InsertTextInRun(text);

Notez que la propriété LogicalDirection de caret peut (et doit) être changée par ceci ; il n'est pas suffisant de créer simplement le TextPointer correct.

1voto

Tarsier Points 1476

Utilisez le GetInsertionPosition() sur le CaretPosition TextPointer. Cela vous permettra d'insérer le texte avant le signe d'insertion.

private void rtb_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Tab)
    {
        rtb.CaretPosition.GetInsertionPosition(LogicalDirection.Backward).InsertTextInRun("    ");
        e.Handled = true;
    }
}

1voto

Pakman Points 825

Pour tester, vous pouvez essayer de forcer le mouvement vous-même :

rtb.CaretPosition = rtb.Document.ContentEnd;

Si cela fonctionne, vous devrez probablement mettre en œuvre une logique supplémentaire pour les situations où l'onglet ne se trouve pas à la fin du contenu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X