2011-09-16 29 views
1

我目前正在開發一個非常簡單的應用程序,它在RichTextBox中具有非常基本的語法高亮顯示功能。RichTextBox中的實時語法高亮顯示

它工作得很好。我在做的是:

  • 如果一個或多個匹配,查找預定義正則表達式的列表。
  • 選擇匹配項,將正確樣式應用於選擇。
  • 然後將光標替換爲最初的位置。

此方法在每個KeyUp事件中被觸發。它使很多閃爍。

所以我的問題是:我怎麼能巧妙地突出顯示我沒有閃爍的文字?這個編輯器將永遠不會包含數千行文本,可能大約有一百個文本,所以我不需要任何非常優化的解決方案。

我嘗試了其他帖子上提出的一些解決方案,但沒有什麼有趣的工作。而且我不想使用另一個庫中的另一個組件 - 我想爲了學習目的而自己做。

+0

您是否嘗試過做它的副本與RenderTargetBitmap,把它的副本在同一個地方在視覺樹,從視覺樹刪除它,做你的操作,把它背在視覺樹,然後刪除副本? –

回答

0

我決定嘗試一些,它的工作令人驚訝!

我一次強調一行。所以當keyUp被觸發時,我只解析所選的行。所以沒有閃爍!

而在啓動時,我製作了一個HighlightLines()方法,通過循環來調用我的HighlightLine(lineIndex)方法。

我會嘗試將我的解決方案與Cheeso's混合使用,我想它會讓一些非常棒的東西!

感謝

+0

如果您沒有在文檔末尾輸入內容,這不會造成問題。例如,如果您在第5行添加30個字,那麼接下來的90行會發生什麼? – Tipx

+0

@Tipx:我的編輯器不是代碼編輯器,只是一個簡單的指令編輯器,有很多行指令,所以我可以安全地使用這個解決方案。但我必須承認,對於任何代碼編輯器來說,它並不能真正解決我的情況:P – TomShreds

+0

非常好! – Tipx

2

我這樣做的方式是等到打字停止,然後突出顯示一次。 這是基本的邏輯:

  • 與每個KEYUP(或testchange等),設置 「最後變化」 的時間,並且,隊列後臺任務(QueueUserWorkItem

  • WaitCallback爲後臺線程,通過System.Threading.Thread.Sleep()等待750ms。當睡眠結束時,檢查「最後更改」時間。它是否少於750毫秒前?如果是這樣,用戶仍然在打字,所以......沒什麼可做的。只需退出該方法。

  • 如果上次更改時間超過750毫秒前,則用戶已停止鍵入。換句話說,在過去750毫秒的實時中沒有發生變化。所以,突出顯示。請記住,您需要在UI線程上進行UI更新。這意味着在應用格式之前,請在WinForms應用程序中檢查this.InvokeRequired,或者在WPF中檢查。

+0

非常好的主意謝謝! – TomShreds