0

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

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

是否可以为每个 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 回答