2010-04-05 73 views
2

我正在將格式應用於WPF RichTextBox中選定的標記。要做到這一點,我得到一個TextRange,它包含了我想強調的標記。然後,我將改變文本的顏色是這樣的:WPF RichTextBox - 輸入文本的格式

// Get start and end pointer for token 
TextPointer startPointer = run.ContentStart.GetPositionAtOffset(startOffset); 
TextPointer endPointer = run.ContentStart.GetPositionAtOffset(endOffset); 

// Get text range for token 
TextRange textRange = new TextRange(startPointer, endPointer); 

// Highlight token 
textRange.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Blue); 

這是對我的RichTextBox的TextChanged事件發生。

格式化按預期方式應用,但繼續輸入文本將導致新文本繼承已應用於相鄰單詞的格式。我希望將任何新文本的格式設置爲使用RichTextBox屬性中定義的默認格式選項。這可能嗎?

另外,我可以突出顯示所有令牌,我不想用默認的格式化選項爲藍色,但這對我來說感覺很尷尬。

回答

3

這不就是標準的行爲嗎?如果我在Word中突出顯示文本,將其設置爲粗體,將光標移動到該文本旁邊並鍵入,新文本也變爲粗體。我可以想象,MS使得富文本框的工作方式類似於Word中的文本區域。

如果您根據匹配某些條件(如語法突出顯示)選擇令牌,是否可以嘗試將樣式應用於文本之後光標距令牌1個字符?例如:

SomeToken |

代替

SomeToken |

其中|是遊標。在第一個示例中光標與標記分隔一個空格,因此如果程序找到SomeToken,它將從S之前到(空格)之前的文本範圍。我會想象那個樣式不會被應用到新輸入的文本中。

我承認這只是一個猜測,我可能誤解了你的問題描述中的確切情況。更多的代碼可能會有所幫助,特別是您提到的TextChanged事件或創建文本範圍的代碼。

+0

感謝您的回覆Benny。 是的,這是標準的行爲,但我試圖實現語法突出顯示,寧願它沒有這樣做。在TextChanged事件中,我簡單地調用了我的解析例程,該例程產生具有用於創建TextRange的開始和結束位置的令牌(我已將此代碼添加到我的原始問題中)。 使用空格作爲分隔符是可能的,但我寧願避免它,因爲空格不能保證。 謝謝, Alan – 2010-04-05 11:52:09

+0

嗯,它不必是空格作爲分隔符。我所建議的是**等待**直到光標位於'endOffset + 1'處,以便在光標和文本範圍之間存在某種東西。所以即使在輸入'SomeToken |'* *之後,輸入「n」後,標記還沒有被選中。但是,當我輸入* next *字符,'SomeToken {|',那麼當我輸入「{」(或任何其他字符)時,就會找到並設置標記。我注意到,語法突出顯示在其他一些程序中就像那樣。對不起,如果我不清楚。我希望更清楚。 – 2010-04-05 12:21:49

+0

再次感謝本尼。別擔心,你很清楚。 我試圖避免的是每個解析器上格式化的完全重置,但我仍然可以看到RichTextBox在繼承相鄰格式時的行爲,如果我沒有完全重置格式,會導致我出現問題。我相信會有一個快樂的媒介。 謝謝, Alan – 2010-04-05 13:01:47