デスクトップアプリケーションのペインにテキストを表示するための非常に軽量な方法を見つけて開発しようとしています。すべてのテキストに 1 つのフォントを設定する以外に、テキストの書式設定に関する要件はありません。TextBox、TextBlock、およびさまざまな監視可能なコレクションを使用してみました。計算効率が最も重要です。
テキストはアプリケーションによって作成され、ユーザーによって変更されることはありません。最も重要な要件は、アプリケーションが通常、1 秒あたり 100 ~ 700 行、ピーク レートが 1 秒あたり 1900 行でテキストを生成することです。アプリケーションが数日間実行されることは珍しくありません。理想的には、最後に追加された行が常に表示されるように、表示を連続的にスクロールします。
私の現在の実装では、TextBox を使用しています (長期的には、現在、テキスト表示を無効にするしかありません)。私が試したことは次のとおりです。
- 設定 IsUndoEnabled="False"
- n (通常は 1000) の後に追加されたテキスト行ごとに、テキストの最初の行を削除します。これは本当に見苦しく、MVVM として再設計するように促されました。
- Observable Collection または BindingList を ListView (ala MVVM) で使用する (驚くべきことに、これは以下の場合でも TextBox よりも悪かった)
- UI の更新が「アイドル」期間に延期されるように、コレクション/リストの抑制が変更されました。
私が試したことの詳細を提供することはできますが、本を書くことから始めたくありませんでした。
これは私の現在の XAML 実装です。
<TextBox Grid.Row="1" Name="tbTraceLog" IsReadOnly="True" IsUndoEnabled="False" VerticalScrollBarVisibility="Auto" FontFamily="Courier New"/>
コードビハインドでは:
for (icount = 0; icount < tlData.stringcount; icount++)
{
tbTraceLog.AppendText(tlData.s[icount]); // TextBox implementation
if (tbTraceLog.LineCount > 1000)
{
// Remove one line
tbTraceLog.Text = tbTraceLog.Text.Substring(tbTraceLog.Text.IndexOf('\n')+1);
}
}
tbTraceLog.ScrollToEnd();
開始できるより基本的なテキスト レンダリング クラスはありますか? TextBlock/TextBox はどのクラスから継承されますか?