2010-03-23 6 views
8

Je veux déplacer le curseur 4 positions vers la droite de l'endroit où se trouve actuellement mon curseur. Je suis inscrit pour PreviewKeyDown, et appelant InsertTextInRun() lorsque la touche de tabulation est capturée, comme ceci:Comment déplacer le curseur d'un certain nombre de positions dans un RichTextBox WPF?

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 caret reste en place après l'appel à InsertTextInRun(). Il ne pas déplacer à la fin du nouveau texte, qui est le comportement que je veux. Comment ferais-je cela?


En aparté - Oui, je sais au sujet de la propriété AcceptsTab sur RichTextBox. Je choisis d'ignorer est et roule ma propre fonctionnalité de tabulation parce que le tabulation avec AcceptsTab a un mauvais effet secondaire d'indenter le texte sur les lignes suivantes, qui est pas ce que je veux.

Répondre

8

Je viens de rencontrer le même problème. Il semble que la position finale du curseur dépend de la manière dont il s'est déplacé juste avant l'insertion.

code suivant veille (3.5sp1) que, après 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 modifié par cette ; il ne suffit pas de créer simplement TextPointer correct.

1

Utilisez la méthode GetInsertionPosition() sur CaretPosition TextPointer. Cela vous permettra d'insérer le texte avant le curseur.

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

Wow, je dois avoir raté ça! Je vais essayer ça très bientôt, merci! :) –

+1

Désolé, pas de dés. Le curseur n'a pas bougé jusqu'à la fin du texte inséré. –

+0

N'a pas fonctionné pour moi non plus, seule la solution qui fonctionne est la solution acceptée. – ToastyMallows

1

Pour tester, vous pouvez essayer de forcer le mouvement vous:

rtb.CaretPosition = rtb.Document.ContentEnd; 

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