2009-09-11 8 views
18

WPFアプリケーションでは、TextBoxのように、各行でメモリを再割り当てせずに大量のテキストをストリーミングできる「ファイルで検索」出力ペインを作成したい行う。WPF大規模コンテンツ用の複数行テキストボックス

WPF TextBoxには、連続した文字列を格納する単一のTextプロパティがあります。毎回、私はコンテンツを追加したい、私は悪いですtextBox.Text += "New Text"を行う必要があります。

理想的には、そのコントロールは仮想であり、最小限のリソースが必要です(可視線の場合のみ)。

標準ListBoxVirtualizingStackPanelで使用することを考えましたが、行間でテキストの選択ができません。

(追加それぞれの新しいラインで、私はコントロールを更新したい)

任意の提案?

+0

リストボックスの代わりにスタックパネル自体を試してください –

+1

@Timothy - 行間でテキストを選択するにはどうすればいいですか? –

+4

頻繁に変更される(私の場合は読み取り専用)テキストボックスにメモリリークの特徴があることを発見したため、この質問に遭遇した人には、UndoLimitをデフォルトの-1以外に設定してください。テキストボックスのデフォルト値-1は、元に戻す履歴の無制限の拡大を可能にします。 – Derrick

答えて

17

アプリケーションで数千もの検索結果を期待していない場合は、TextBlockコントロールまたはreadonly multiline TextBoxで十分です。

TextBoxクラスには、AppendText()メソッドが用意されています。

テキストの強調表示/書式設定が必要な場合は、多分RichTextBoxを使用します。

+1

codymanixありがとうございました。MSDNのdoc: AppendTextメソッドを使用すると、テキスト連結を使用せずにテキストコントロールの内容にテキストを追加できるため、多くの連結が必要な場合にパフォーマンスが向上します。 .NET Reflector内の実装を見ても、AppendTextは必要なものです。 – decasteljau

+2

このソリューションにはパフォーマンス上の問題があります。 TextBoxは仮想ではなく、各AppentText()呼び出しで複雑な計算を実行します。 私は、それが再描画されるコントロールを必要とすると思います&レイアウトは、ItemsControlのように仮想的に行います。 – decasteljau

+10

テキストボックスには、取り消し操作のための各追加情報が格納されている可能性があることに注意してください。 – Kelly

0

RichTextBoxコントロールを検討しましたか?

+0

私たちは試しましたが、パフォーマンスは悲惨なものになるでしょう。おそらく、私は必要のない文字列フォーマットに関連した過度の攻撃のためです。 – decasteljau

+0

私にお知らせいただきありがとうございます。 @ codymanixの答えは完璧に聞こえる - 私はそれを知らなかった。 –

-1

AのStringBuilder、ちょうどこれはSchlemiel the Painter'sアルゴリズムの世話をする必要があります

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

を行う文字列ビルダーにテキストを追加し、代わりの

textBox.Text += moreText; 

を行います。

もちろん、文字列ビルダーは、オブジェクトの寿命を通して存在するように、クラスのメンバーである必要があります。

+0

StringBuilderでToString()を呼び出すたびに、連結された文字列を含む新しい連続した文字列が割り当てられます。私はコントロールに常に新しい行を追加するので、私はそれを望んでいません。 新しい行ごとに、コントロールを更新する必要があります。 – decasteljau

5

本当に大きなコンテンツがある場合、残念ながらWPFのテキストボックスやそれに類するコントロールはすべて非常に遅いです。 this questionを参照してください。代わりにAvalonEditを使用することができます。

関連する問題