2016-09-07 1 views
0

J'ai beaucoup de mal à obtenir un AvalonEdit TextEditor pour faire défiler une ligne spécifique. Le comportement ScrollTo() consiste simplement à faire défiler jusqu'à ce que cette ligne soit au milieu de la vue. J'ai essayé de nombreuses méthodes différentes trouvées autour de l'Internet et SO comme obtenir le décalage avecAvalonEdit faites défiler jusqu'à la ligne

double visualTop = textEditor.TextArea.TextView.GetVisualTopByDocumentLine(line); 

Mais chacun a eu ses propres problèmes. Par exemple, dans la ligne ci-dessus, je recevais des exceptions avec le TextView.VisualLines.

Répondre

3

J'ai fini par me rendre compte que, puisque mon texte était tout en hauteur, je pouvais juste faire la ligne hauteur * ligne # pour obtenir le décalage. J'ai d'abord essayé de le faire en utilisant (Editor.TextArea.TextView.DocumentHeight/Editor.Document.LineCount) pour calculer la hauteur de la ligne, mais cela semblait être légèrement éteint, probablement en raison de certains problèmes de virgule flottante, et était de plus en plus la marque plus loin dans le document. Mais, encore une fois depuis mon document est une hauteur uniforme, je compris que je pouvais utiliser la propriété TextView.DefaultLineHeight et est venu avec:

double vertOffset = (Editor.TextArea.TextView.DefaultLineHeight) * Line; 
Editor.ScrollToVerticalOffset(vertOffset); 

Ce défile très toujours exactement au bon endroit dans le document.

+0

Cela fonctionne pour moi, mais je dois soustraire 1 du numéro de ligne. En outre, je pense que c'est une meilleure expérience utilisateur pour définir le décalage du curseur sur la ligne que vous avez défilée. –

+0

Cela dépend certainement de votre application, mais j'aime l'idée du signe. Dans mon cas cependant, j'avais deux éditeurs que je voulais quelque peu synchronisés (sorte de créer des en-têtes flottants avec des données dans un fichier texte) de sorte que la fenêtre que je défilais était en lecture seule et aucun caret nécessaire. – zaknotzach

1

Une autre façon de procéder consiste à définir la position du curseur, puis à appeler BringCaretToView(). En F #:

editor.TextArea.Caret.Offset <- offset 
editor.TextArea.Caret.BringCaretToView() 

Cette défilera la ligne contenant « offset » en vue, mais il ne sera pas défiler le texte dans l'éditeur de telle sorte que cette ligne est maintenant le premier visible. L'approche que vous adoptez peut donc dépendre du fait que vous souhaitez que la ligne cible soit au sommet ou non.

+0

J'avais besoin de faire cela sans bouger le Caret. Aussi, j'ai trouvé que des méthodes comme celle-ci n'avaient parfois pas la ligne que je voulais en haut de l'écran mais juste "en vue" quelque part. – zaknotzach