5

ドキュメントラインが提供されたときにテキストの背景をプログラムで変更するものを実装したい(テキストのブロック選択に非常によく似たもの。これをIDEのデバッグブレークポイントに使用します)設計)。テキストボックスがスクロールするため、selectionを使用する必要はありません。

DocumentColorizingTransformerを使用する必要があると思いますが、これをどのように行うかは100%わかりません。

public class ColorizeAvalonEdit : ICSharpCode.AvalonEdit.Rendering.DocumentColorizingTransformer
    {
        protected override void ColorizeLine(ICSharpCode.AvalonEdit.Document.DocumentLine line)
        {
            int lineStartOffset = line.Offset;
            string text = CurrentContext.Document.GetText(line);
            int start = 0;
            int index;
            if (line.LineNumber == LogicSimViewCodeWPFCtrl.currentLine)
            {
                while ((index = text.IndexOf(text, start)) >= 0)
                {
                    base.ChangeLinePart(
                        lineStartOffset + index, // startOffset
                        lineStartOffset + index + text.Length, // endOffset
                        (VisualLineElement element) =>
                        {
                            element.TextRunProperties.SetBackgroundBrush(Brushes.Red);

                        });
                    start = index + 1; // search for next occurrence
                }
            }
        }
    }

currentLineは、強調表示される部分です。

上記のコードは正しく機能します。唯一の問題は、その行を表示しているときにcurrentLineが変更された場合、ドキュメントの別の部分にスクロールして(更新された行を非表示にする)、更新された行が強調表示されないことです。更新された行に。

また、行番号をゼロから開始するにはどうすればよいですか?

4

3 に答える 3

3

それは彼らの作成だったので、私はSharpDevelopのソースと彼らがそれをどのように行ったかを覗き見ました。

彼らはブックマークタイプ(BreakpointBookmark)を定義し、行にブックマークを追加しました。ブックマーク自体がCreateMarkerメソッドの線の色を設定します。SharpDevelopでブレークポイントの色を設定できないのは不思議です。

それが役に立てば幸い。

    protected override ITextMarker CreateMarker(ITextMarkerService markerService)
    {
        IDocumentLine line = this.Document.GetLine(this.LineNumber);
        ITextMarker marker = markerService.Create(line.Offset, line.Length);
        marker.BackgroundColor = Color.FromRgb(180, 38, 38);
        marker.ForegroundColor = Colors.White;
        return marker;
    }
于 2012-08-16T12:23:41.353 に答える
2

私は答えを見つけました

TxtEditCodeViewer.TextArea.TextView.Redraw();
于 2012-08-21T01:28:18.773 に答える
0

これはこの質問の複製ではありませんか?

InvalidateArrange()ただし、エディターまたはInvalidateVisual()変更された各ビジュアルを呼び出す必要があるようです。

于 2012-08-18T23:56:12.197 に答える