2016-09-07 26 views
0

AvalonEdit TextEditorを特定の行にスクロールさせるのに多くの問題があります。 ScrollTo()の動作は、その行がビューの中央にくるまでスクロールするだけです。私はインターネット上で見つかったさまざまな方法を試しましたが、オフセットを取得するのが好きです。AvalonEdit行をスクロールする

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

しかし、それぞれ独自の問題がありました。たとえば、上記の行では、私はTextView.VisualLinesで例外を取得していました。

答えて

3

私のテキストはすべて一様な高さなので、オフセットを得るために行の高さを* line#だけすることができました。私は最初に(Editor.TextArea.TextView.DocumentHeight/Editor.Document.LineCount)を使って行の高さを計算しようとしましたが、浮動小数点の問題が原因で多少ずれているように見えました。私の文書が均一な高さがあるので、しかし、再び、私はTextView.DefaultLineHeightプロパティを使用することができます実現し、思い付いた:

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

これは非常に一貫文書で正確に適切な場所にスクロールします。

+0

私にとってはうまくいくが、行番号から1を引く必要がある。また、スクロールした行にキャレットオフセットを設定する方がユーザエクスペリエンスが優れていると思います。 –

+0

これは間違いなくアプリケーションに依存しますが、私はキャレットのアイデアが気に入っています。私の場合、2つのエディタを同期させたいと思っていました(テキストファイルのデータで浮動ヘッダーを作成するようにしました)ので、自動スクロールしていたウィンドウは読み込み専用で、キャレットは必要ありませんでした。 – zaknotzach

1

これを行う別の方法は、キャレットの位置を設定し、BringCaretToView()を呼び出すことです。 F#の場合:

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

これは、ビューに「オフセット」を含む行をスクロールしますが、それはこの行は今最初の可視一つであることを、このようなエディタでテキストをスクロールしません。だからあなたが取るアプローチは、ターゲットラインを最上位にするかどうかによって異なります。

+0

私はキャレットを動かさずにこれを行う必要がありました。また、このような方法では、私が画面の上部で欲しがっていたラインを持っていない場合があることがわかりました。 – zaknotzach

関連する問題