0

現在、AvalonEdit を使用して、.NET 4 でムービー スクリプト エディターを開発しています。

スクリプトの各要素タイプ (文字、ダイアログ行など) には、右マージンが必要です。つまり、1 行に一定数の文字が入力された後、次の文字は別の行に配置する必要があります。

DocumentLine ごとに右マージンを割り当てることは可能ですか?それとも、各入力を個別に処理して、次の行にスキップする必要があるかどうかを判断する必要がありますか?

私はこのアプローチを使用してみましたが、いつ移動し、テキストを置き換え、キャレットを再配置するかを計算することは簡単ではなく、かなりの作業が必要になります。絶対に必要でない限り、このアプローチは避けたいと思います。

DocumentLine ごとに適切なマージンを設定する代わりに、どのような方法がありますか?

4

1 に答える 1

1

この要素ジェネレーターは、20 列ごとに改行を導入します。

public class WrapAtCol20 : VisualLineElementGenerator
{
    public override int GetFirstInterestedOffset(int startOffset)
    {
        DocumentLine line = CurrentContext.Document.GetLineByOffset(startOffset);
        int col = startOffset - line.Offset;
        int wrapCol = ((col / 20) + 1) * 20;
        if (wrapCol < line.Length) {
            return line.Offset + wrapCol;
        }
        return -1;
    }

    public override VisualLineElement ConstructElement(int offset)
    {
        return new WrapElement();
    }

    class WrapElement : VisualLineElement
    {
        public WrapElement() :  base(visualLength: 1, documentLength: 0)
        {
        }

        public override TextRun CreateTextRun(int startVisualColumn, ITextRunConstructionContext context)
        {
            return new TextEndOfLine(1);
        }
    }
}

これは、大文字のジェネレーターとの相互作用が不十分になる可能性があることに注意してください。つまり、大文字になるテキスト全体に対して単一の要素を生成するため、他のジェネレーターが間に要素を挿入できなくなります。そのための解決策は、カラーライザーが大文字を処理できるように AvalonEdit を変更することです。

于 2012-07-21T16:07:19.830 に答える