6

信じられないほど素晴らしい AvalonEdit WPF TextEditor コントロールには、重要な機能が欠けているようです。少なくとも、私にはそれがわかりません。オフセットと長さを指定して、TextDocument 内のその部分を HighlightColor で強調表示します。シンプルですね。

どうやらそうではありません。私は RTFM を使用しており、「構文の強調表示」に関するドキュメントでさらに混乱しました。他の誰かが SharpDevelop フォーラムで同じ質問をしましたが、Herr Grunwald の回答が理解できません。

DocumentHighlighter クラスを使用した私の試みは次のとおりです(もちろん機能しません)。

    textEditor1.Text = "1234567890";

    HighlightingColor c = new HighlightingColor() { FontWeight = FontWeights.ExtraBold };

    DocumentHighlighter dh = new DocumentHighlighter(textEditor1.Document, new HighlightingRuleSet());
    HighlightedLine hl = dh.HighlightLine(1);

    hl.Sections.Add(new HighlightedSection() { Color = c, Offset = 1, Length = 3 });

助けてくれてありがとう!

4

4 に答える 4

7

背景情報: AvalonEdit はコード エディターであり、リッチ テキスト エディターではありません。「ドキュメントの一部を強調表示する」というようなことはありません。ドキュメントにはプレーンテキストのみが保存されます。

強調表示は、現在表示されている行に対してのみ、オンデマンドで計算されます。カスタムの強調表示が必要な場合は、強調表示の計算にステップを追加する必要があります。これはColorizeAvalonEdit、mzabsky によって投稿された例のクラスが行っていることです。

于 2011-02-17T15:29:43.180 に答える
7

この記事でこれを見ましたか- それはまさにあなたが求めているもののようです:

public class ColorizeAvalonEdit : DocumentColorizingTransformer
{
protected override void ColorizeLine(DocumentLine line)
{
    int lineStartOffset = line.Offset;
    string text = CurrentContext.Document.GetText(line);
    int start = 0;
    int index;
    while ((index = text.IndexOf("AvalonEdit", start)) >= 0) {
        base.ChangeLinePart(
            lineStartOffset + index, // startOffset
            lineStartOffset + index + 10, // endOffset
            (VisualLineElement element) => {
                // This lambda gets called once for every VisualLineElement
                // between the specified offsets.
                Typeface tf = element.TextRunProperties.Typeface;
                // Replace the typeface with a modified version of
                // the same typeface
                element.TextRunProperties.SetTypeface(new Typeface(
                    tf.FontFamily,
                    FontStyles.Italic,
                    FontWeights.Bold,
                    tf.Stretch
                ));
            });
        start = index + 1; // search for next occurrence
}   }   }

AvalonEdit という単語が太字で強調表示されます。

于 2011-02-17T13:48:09.107 に答える
5

これを行うには、カスタム ColorizingTransformer を作成する必要があります。上記の例は、実際には特定の単語を強調表示しています。それでも、少し変更して、部分に色を付けたり強調したりすることができます.

Console+プロジェクトに Avalon TextEditor を使用しました (現時点では非常に原始的な段階にあります)。

public class OffsetColorizer : DocumentColorizingTransformer
{
    public int StartOffset { get; set; }
    public int EndOffset { get; set; }

    protected override void ColorizeLine(DocumentLine line)
    {
        if (line.Length == 0)
            return;

        if (line.Offset < StartOffset || line.Offset > EndOffset)
            return;

        int start = line.Offset > StartOffset ? line.Offset : StartOffset;
        int end = EndOffset > line.EndOffset ? line.EndOffset : EndOffset;

        ChangeLinePart(start, end, element => element.TextRunProperties.SetForegroundBrush(Brushes.Red));
    }
}

また、LineTransformers コレクションに追加することで、カラーライザーをエディターに追加できます。

tbxConsole.TextArea.TextView.LineTransformers.Add(_offsetColorizer);
于 2012-10-05T08:34:12.173 に答える
2

これはかなり古い質問であることは知っていますが、解決策を共有したいと思いました。この質問は最初に回答されたので、このソリューションが AvalonEdit に実装されているかどうかはわかりませんが、OffsetColorizer クラスは実際には線を選択していません。線の背景色を変更するだけです。

私の解決策は次のとおりです。

textEditor.SelectionStart = offset;

textEditor.SelectionLength = length;

ただし、これは次のようにさらに拡張できます。

public void SelectText(int offset, int length)
{
    //Get the line number based off the offset.
    var line = textEditor.Document.GetLineByOffset(offset);
    var lineNumber = line.LineNumber;

    //Select the text.
    textEditor.SelectionStart = offset;
    textEditor.SelectionLength = length;

    //Scroll the textEditor to the selected line.
    var visualTop = textEditor.TextArea.TextView.GetVisualTopByDocumentLine(lineNumber);
    textEditor.ScrollToVerticalOffset(visualTop); 
}

このソリューションは、行に色を付けるだけでなく、実際に選択することでうまく機能することがわかりました。つまり、Ctrl + Cを使用してコピーできます。

これが将来人々に役立つことを願っています。

于 2016-06-15T08:51:53.970 に答える