我目前正在使用AvalonEdit在.NET 4中开发电影脚本编辑器。
脚本中的每个元素类型(即:字符,对话框行等)都应该有一个右边距。换句话说,在每行一定数量的字符后,下面的字符应该在另一行上。
是否可以为每个DocumentLine分配一个右边距,或者我们是否被迫单独处理每个输入,并确定何时必须跳到下一行?
我尝试使用这种方法,但是必须计算何时移动,替换文本并重新定位插入符号并非易事,并且需要相当多的工作。除非我绝对需要,否则我想避免这种做法。
每个DocumentLine有哪些替代方案可以获得正确的边距?
答案 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,以便上部外壳可以由着色器处理。