我有一個WPF文本框(不是一個RichTextBox)和本框裏面,我想強調的(在網絡瀏覽器等)的搜索結果突出顯示文本框的文本,而不使用RichTextBox控件
例如,如果我搜索「 abc「,所有發生的」abc「應該被突出顯示(例如,用一些紅色背景或字體)
我想知道這是可能的,而不使用RichTextBox控件,或者不是真的嗎?
我有一個WPF文本框(不是一個RichTextBox)和本框裏面,我想強調的(在網絡瀏覽器等)的搜索結果突出顯示文本框的文本,而不使用RichTextBox控件
例如,如果我搜索「 abc「,所有發生的」abc「應該被突出顯示(例如,用一些紅色背景或字體)
我想知道這是可能的,而不使用RichTextBox控件,或者不是真的嗎?
這裏沒有內置功能。此外,TextBox僅支持整個文本的單一字體樣式。
如果文本應該是隻讀的,您可以使用流或固定文檔並在運行元素中格式化文本。
這是可能的,但它更容易使用RichTextBox
,所以你可以考慮使用它,而且你不能改變字體大小,但只能改變顏色(背景和/或前景)和效果。
首先,您必須從TextBox
派生自己的類,因爲您將覆蓋其渲染方法。現在覆蓋OnRender()
方法,在這裏您將使用DrawingContext.DrawText()
方法繪製文本(將所有內容放置在FormattedText
對象內,主要您必須調整其屬性以使其類似於標準TextBox
)。
現在你擁有的是一個普通的TextBox
其中此外你畫你的文字。以此爲起點,你可以選擇:
完全覆蓋TextBox
文本繪製:設置TextBox.Foreground
屬性Brushes.Transparent
。用戶將與「真實」的文字互動,但他會看到你的平局。請注意,要完成這項工作,您必須準確地模仿原始TextBox
中的文本如何繪製(例如,如果您更改字體大小,則它們將未對齊)。
添加您需要的高亮功能,保留底部TextBox
文字繪圖:計算您想要突出顯示的文字的位置,然後繪製適當的背景。
參考
這(簡化!)算法來自CodeBox2,它最初被設計爲一個TextBox
一些簡單的編輯器類似的功能擴展。
感謝您的回答!我嘗試了第一種方法(完全覆蓋文本繪圖) - 它工作正常,直到TextWrapping進場... 我不知道如何計算突出顯示的文本位置(另一種方法)。 – Zsolt 2012-07-25 08:53:12
@Zsolt是它可能有點棘手,但您可以使用FormattedText(再次必須完全匹配TextBox設置),其中要突出顯示的文本位於正確的顏色/背景中,而其他所有內容都是透明的。 – 2012-07-25 10:02:52