AvalonEdit:每个DocumentLine的右边距

时间:2012-07-20 15:41:42

标签: c# .net avalonedit

我目前正在使用AvalonEdit在.NET 4中开发电影脚本编辑器。

脚本中的每个元素类型(即:字符,对话框行等)都应该有一个右边距。换句话说,在每行一定数量的字符后,下面的字符应该在另一行上。

是否可以为每个DocumentLine分配一个右边距,或者我们是否被迫单独处理每个输入,并确定何时必须跳到下一行?

我尝试使用这种方法,但是必须计算何时移动,替换文本并重新定位插入符号并非易事,并且需要相当多的工作。除非我绝对需要,否则我想避免这种做法。

每个DocumentLine有哪些替代方案可以获得正确的边距?

1 个答案:

答案 0 :(得分: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);
        }
    }
}

请注意,这可能与upper-casing generator的交互性很差 - 为整个文本生成一个单一元素,这将是大写的,这可以防止其他生成器在其间插入元素。解决方案是更改AvalonEdit,以便上部外壳可以由着色器处理。