2012-07-20 82 views
0

我目前使用AvalonEdit开发.NET中的电影脚本编辑器右页边距4.AvalonEdit:每DocumentLine

脚本中的每个元素类型(即:字符,对话框线等)应该有一个正确保证金。换句话说,每行一定数量的字符后,下面的字符应该放在另一行。

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

我尝试过使用这种方法,但不得不计算何时移动,替换文本和重定位插入符不是微不足道的,需要相当多的工作。除非我绝对需要,否则我想避免这种方法。

还有什么替代方法可以为每个DocumentLine设置正确的边距?

+1

你想在给定数量的字符之后引入人造字换行吗? 我认为可以使用VisualLineElementGenerator来插入TextLineBreak元素。 – Daniel 2012-07-20 19:01:49

+0

是的,这正是我正在寻找:) – 2012-07-21 15:17:56

回答

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,以便上色外壳可以由色彩处理器处理。

+0

谢谢丹尼尔,一如既往,你是巨大的帮助。干杯! – 2012-07-21 19:06:25

相关问题