2012-07-20 26 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