我正在尝试寻找/开发一种非常轻量级的方法来在我的桌面应用程序的窗格中显示文本。除了为所有文本设置单一字体外,我对文本格式没有任何要求。我尝试过使用 TextBox、TextBlock 和各种可观察的集合。计算效率至关重要。
文本由应用程序创建,用户永远不会修改。最重要的要求是应用程序通常以每秒 100 到 700 行的速度生成文本,峰值速率为每秒 1900 行。应用程序运行几天并不罕见。理想情况下,显示将连续滚动,以便添加的最后一行始终可见。
我当前的实现使用 TextBox(对于更长的时间,我目前别无选择,只能禁用文本显示)。我尝试过的事情包括:
- 设置 IsUndoEnabled="False"
- 删除在 n 之后添加的每一行文本(通常为 1000)的第一行文本。这真的很难看,并促使我尝试将其重新设计为 MVVM。
- 使用带有 ListView (ala MVVM) 的 Observable Collection 或 BindingList
- 抑制收集/列表已更改,以便 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 继承自哪些类?