2009-09-11 56 views
18

在WPF應用程序中,我想構建一個「在文件中查找」輸出窗格,在該窗格中可以流式傳輸大量文本,而不必在每行重新分配內存,如TextBox做。用於大型內容的WPF多行文本框

的WPF TextBox具有單個Text屬性,其存儲的連續字符串。每次,我想添加內容,我需要做textBox.Text += "New Text",這是不好的。

理想情況下,控制將是虛擬的,需要最少的資源,只爲可見的線條。

我想過使用標準ListBoxVirtualizingStackPanel,但它不允許跨行選擇文本。

(在每一個新行補充說,我想控制更新)

什麼建議嗎?

+0

嘗試使用堆棧面板本身而不是列表框 – 2009-09-11 20:29:27

+1

@Timothy - 如何跨行選擇文本? – 2009-09-11 21:05:33

+4

對於遇到這個問題的人來說,因爲他們發現經常變化(在我的情況下,只讀)文本框具有內存泄漏的特徵,所以一定要將UndoLimit設置爲非缺省值-1。文本框的默認值爲-1將允許撤消歷史的無限增長。 – Derrick 2011-11-16 22:53:36

回答

17

如果你不希望太多十餘數以千計的搜索結果在您的應用程序,一個TextBlock控制或只讀多行TextBox將遠遠足夠了。

TextBox類有這應該是足夠快,你的AppendText通過()方法。

如果您需要文本突出顯示/格式化,那麼也許您想使用RichTextBox。

+1

感謝codymanix,MSDN文檔說: AppendText方法使用戶能夠將文本附加到文本控件的內容而不使用文本串聯,當需要多個串接時可以產生更好的性能。 同樣在查看.NET Reflector內部的實現之後,AppendText正是我所需要的。 – decasteljau 2009-09-12 11:28:20

+2

此解決方案存在性能問題。 :(TextBox需要太多的UI資源(CPU),當用數千行控制氾濫時TextBox並不是虛擬的,並且在每個AppentText()調用時都會進行復雜的計算 我認爲我們需要一個控制來重繪並以虛擬方式佈局,就像ItemsControl所做的那樣 – decasteljau 2009-09-14 13:30:31

+10

請記住,文本框可以存儲每個附加操作的撤消操作,您可能需要更改文本框的UndoLimit字段。 – Kelly 2010-07-01 16:10:56

0

你有沒有考慮或嘗試RichTextBox控制?

+0

我們已經嘗試過了,但是性能變得糟糕,可能是因爲與字符串格式有關的矯枉過正,我不需要這些。 – decasteljau 2009-09-12 11:17:52

+0

謝謝你讓我知道。 @科迪曼尼克斯的答案聽起來很完美 - 我不知道。 – 2009-09-12 15:20:10

-1

一個StringBuilder,只是追加文本字符串生成器和與其做

textBox.Text += moreText; 

myStringBuilder.Append(moreText); 
textBox.Text = myStringBuilder.ToString(); 

這應該採取Schlemiel the Painter's算法的照顧。

當然,字符串生成器應該有是你的類的成員,因此存在通過你的對象的生命週期。

+0

每次調用StringBuilder上的ToString()時,它都會分配一個包含連接字符串的新連續字符串。由於我會一直在控制中添加新的線條,所以我完全不想要這樣。 對於每一個新行,我希望控件更新。 – decasteljau 2009-09-12 11:15:28

5

如果你有非常大的內容,那麼不幸的是所有的WPF文本框和類似的控件都非常慢。見this question。您可以使用AvalonEdit作爲替代。