2009-09-11 38 views
18

Bir WPF uygulamasında, her satırda belleği yeniden tahsis etmeden, büyük miktarda metin akışı yapabileceğim "Dosyaları Bul" çıktı bölmesi oluşturmak istiyorum, örneğin TextBox yap.WPF Çok satırlı TextBox büyük içerik için

WPF TextBox, bitişik bir dizeyi saklayan bir Text özelliğine sahiptir. Her seferinde içerik eklemek istiyorum, textBox.Text += "New Text" yapmam gerek, bu da kötü.

İdeal olarak bu kontrol sanal olacak ve sadece görünür çizgiler için, kaynakların en az gerektirir.

ListBox standardını VirtualizingStackPanel ile kullanmayı düşündüm, ancak satırlar arasında Metin Seçimine izin vermiyor.

Herhangi bir öneri (her yeni hat azından ben kontrol güncellemek istiyorum, eklendi)?

+0

yığın paneli kendisi yerine liste kutusu –

+1

@Timothy deneyin - nasıl hatlarında metin seçimini sağlayacak? –

+4

Sıklıkla değiştiğini (yalnızca benim durumumda okuyan) metin kutusunun bellek sızıntısı özelliklerine sahip olduklarını fark ettikleri için bu soruya gelen insanlar için, UndoLimit değerini varsayılan olarak -1 değerinden başka bir değere ayarladığınızdan emin olun. Bir metin kutusu için -1'in varsayılan değeri, geri alınmamış tarihin sınırsız büyümesine izin verir. – Derrick

cevap

17

uygulamanıza, şimdiye kadar yeterli olacaktır TextBlock kontrolü veya salt okunur satırlı TextBox arama sonuçlarının çok daha fazla on binlerce beklemeyin.

TextBox sınıfında, sizin için yeterince hızlı olması gereken bir AppendText() yöntemi vardır. Metin vurgulama/biçimlendirme gerekiyorsa

sonra belki RichTextBox'a kullanmak istiyorum.

+1

Teşekkürler codymanix, MSDN doc diyor ki: AppendText yöntemi, kullanıcının bir metin denetiminin içeriğini metin birleştirme denetimine eklemesine olanak sağlar; bu, birçok birleştirme gerektiğinde daha iyi bir performans sağlayabilir. Ayrıca .NET Reflector içindeki uygulamaya baktıktan sonra, AppendText tam ihtiyacım olan şeydir. – decasteljau

+2

Bu çözümle ilgili bir performans sorunu var. :(TextBox, binlerce satır ile denetimi taşırken çok fazla UI kaynakları (CPU) alır.TextBox sanal değildir ve her bir AppentText() çağrıları karmaşık hesaplamalar yapar. Ben redraw yapar bir kontrol gerekir & Düzeni, ItemsControl'ün yapacağı gibi sanal bir şekilde düzenleyin: – decasteljau

+10

Metin kutusunun, işlemlerin geri alınması için ekinizin her birini saklayabileceğini unutmayın.Yalnızdaki UndoLimit alanını değiştirmek isteyebilirsiniz. – Kelly

0

dikkatinizden veya RichTextBox kontrolünü denediniz mi?

+0

Denedik, ancak performans, muhtemelen ihtiyacım olmayan dize biçimlendirmeyle ilgili aşırı sıkıntı nedeniyle, felaket olur. – decasteljau

+0

Bana bildirdiğiniz için teşekkür ederiz. @ codymanix'in cevabı mükemmel geliyor - bunu bilmiyordum. StringBuilder öğesinde ToString() öğesini her aradığınızda –

-1

Bir StringBuilder, sadece dize oluşturucu metin ekleyin ve yerine

textBox.Text += moreText; 

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

Bu Schlemiel the Painter's algoritmanın özen yapmak yapmanın. senin nesnenin ömrünün geçerek vardır böylece

Tabii ki, dize oluşturucu senin sınıfın üyesi olmak olmalıdır.

+0

, birleştirilmiş dizeleri içeren yeni bitişik bir dize ayırır. Her zaman kontrole yeni çizgiler ekleyeceğime göre, bunu kesinlikle istemiyorum. Her yeni satır için, kontrolün güncellenmesini istiyorum. – decasteljau

5

Gerçekten çok büyük içeriğiniz varsa, ne yazık ki tüm WPF metin kutusu ve benzeri denetimler çok yavaş. Bakınız this question. Yerine AvalonEdit'u kullanabilirsiniz.