2016-10-10 3 views
0

J'ai un RichTextBox avec un formatage personnalisé sur des bits spéciaux de texte. Cependant, il y a un bug où, après l'insertion d'un personnage, le signe insertion est placé avant le caractère nouvellement inséré au lieu de l'après.Comment puis-je déplacer la mise en page par programmation dans un RichTextBox?

C'est parce que pour chaque édition, le code recalcule le contenu d'appliquer la mise en forme personnalisée et définit ensuite la CaretPosition comme si ...

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; 

    } 

Je ne sais pas comment déplacer le curseur dans le code si qu'il apparaît APRÈS le caractère inséré, par exemple si le contenu original est "11" et que j'insère un "2" au milieu du texte, je voudrais que le Caret soit après le "2".

Il apparaît actuellement comme "1x21" (où x est le Caret). Toute aide serait appréciée

Répondre

1

La position et la direction logique indiquées par un objet TextPointer sont immuables. Lorsque le contenu est modifié ou modifié, la position indiquée par un TextPointer ne change pas par rapport au texte qui l'entoure; plutôt le décalage de cette position à partir du début du contenu est ajusté de façon correspondante pour refléter la nouvelle position relative dans le contenu . Par exemple, un TextPointer qui indique une position au début d'un paragraphe continue à pointer au début de même si le contenu est inséré ou supprimé avant ou après le paragraphe. MSDN

Le code insère ci-dessous le texte sur 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

Merci, cela explique beaucoup de choses! Je vais essayer d'utiliser le décalage pour le nouveau contenu pour déplacer la position du curseur – Tiggy