私は、ソケット経由でデバイスに接続し、ストリーミングテキストデータを取得するWPFアプリケーションを用意しています(毎秒約1メッセージ)。このデータはUIに表示されます。ユーザーはのようなルールを作成することができます。 "データに 'abc'が含まれている場合、"または"の文字列を太字にして" "にすると、プレーンテキスト出力はできません。WPFを使用したストリーミングリッチテキストの表示
私の現在の解決策は、フォーマットされた出力を含む私のViewModelにFlowDocumentを持つことです。 Viewには、ViewModelのFlowDocumentにバインドされているFlowDocumentScrollViewerがあります。
これは機能しますが、FlowDocumentが大きくなると(〜6,000行)パフォーマンスが低下し始めます。現在のアルゴリズムでは10,000の行数を上限にしていますが、アプリが使用できないほど問題はさらに悪化します。それが10,000行に達すると、追加されるすべての行の行が削除され、FlowDocumentScrollViewerは新しい行ごとに2つの更新通知を取得します。
バッチ削除の方法を見つけようとしましたが(10,000行に達したときに最も古い1,000行を削除します)、FlowDocumentに一括削除はありません。 1000回ループして削除を実行すると、1,000件の更新通知が表示され、UIがロックされます。私の問題だ
は、ここに私の質問です:
WPFとストリーミングリッチテキストコンテンツを表示するための最良の方法は何ですか?私は毎秒〜1メッセージ、各メッセージは〜150文字です。最後の10000メッセージを残したいと思います。私はこれについて間違った方法をとっていますか?より良いパフォーマンスを発揮する他のコントロール/オブジェクトがありますか?
EDIT:ここではいくつかのより多くの要件
- が、それは別の文書に貼り付けることができるよう、出力テキストを選択してコピーできるようにする必要があり、出力テキスト
- を印刷できるようにする必要がありますされています
似たようなシナリオを私のマシンで使用するには、劇的なperf問題(例:10Kの段落を追加するのに2秒未満)が必要です。 FlowDocumentの最後にどのようにコンテンツを追加していますか? – kvb
データが文字列として私に届きます。私は文字列で文字列を作成し、次に文字列で文字列を指定します。それから、私はthis.MyFlowDoc.Blocks.Add(段落)を呼び出します。 –