2017-03-03 3 views
0

J'ai un contrôle WPF Rich Text Box où je remplace le texte par un nouveau texte de la même longueur et je veux simplement obtenir la position initiale du curseur avant de remplacer le texte, remplacez le texte, puis réinitialisez la position du curseur.Essayer de réinitialiser la position du curseur dans un contrôle WPF Rich Text Box

Je pense que le problème est qu'il utilise un TextPointer qui est lié à la RichTextBox et est réinitialisé lorsque j'efface le texte d'origine de sorte que lors de la réappliquer la position a changé. Ce que je veux réellement faire est de le réinitialiser à l'index de position de caractère dans le texte original ou je suis heureux de traiter avec des lignes et des colonnes.

J'ai parcouru Internet pour trouver une réponse à ce qui devrait être un problème très simple et rien ne semble y répondre. Ce que je veux vraiment, c'est une coordonnée X/Y ou tout ce qui peut aider.

Répondre

0

Vous pouvez utiliser GetOffsetToPosition() et GetPositionAtOffset() pour enregistrer la position relative du Caret et le restaurer.

En d'autres termes, en supposant que le RichTextBox initialise comme ceci:

RichTextBox rtb; 
    int paragraphIndex = -1; 
    int indexInParagraph; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     rtb = new RichTextBox(); 
     rtb.Document = new FlowDocument(); 
     Paragraph para = new Paragraph(new Run("some text some text some text.")); 
     rtb.Document.Blocks.Add(para); 
     // sets the caret at a specific (random) position in the paragraph: 
     rtb.CaretPosition = para.ContentStart.GetPositionAtOffset(5); 
     this.Content = rtb; 
    } 

Notez les trois champs privés dans la classe.

Vous devez enregistrer l'indice de caret paragraphe et l'indice de caret dans le paragraphe, avant de remplacer le texte:

public void SaveCaretState() 
    { 
     //enumerate and get the paragraph index 
     paragraphIndex = -1; 
     foreach (var p in rtb.Document.Blocks) 
     { 
      paragraphIndex++; 
      if (p == rtb.CaretPosition.Paragraph) 
       break; 
     } 
     //get index relative to the start of the paragraph: 
     indexInParagraph = rtb.CaretPosition.Paragraph.ElementStart.GetOffsetToPosition(rtb.CaretPosition); 
    } 

et restaurer chaque fois que vous avez aimé:

public void RestoreCaretState(MouseEventArgs e) 
    { 
     // you might need to insure some conditions here (paragraph should exist and ...) 
     Paragraph para = rtb.Document.Blocks.ElementAt(paragraphIndex) as Paragraph; 
     rtb.CaretPosition = para.ElementStart.GetPositionAtOffset(indexInParagraph); 
    } 

S'il vous plaît noter que c'est un exemple simple et il pourrait y avoir d'autres Block dans RichTextBox.Document. Cependant, l'idée et la mise en œuvre ne sont pas très différentes.

+0

Merci pour cela et cela a aidé. Je remarque qu'une position considère un bloc comme une position donc quand j'ajoute des blocs, la position de + = peut sauter un bloc entier mais je peux le comprendre. Merci de votre aide. – user6590430