我有一个TextBox,它绑定到我的ViewModel中的字符串。
XAML
<TextBox x:Name="TracesTextBox" IsReadOnly="True" Text="{Binding Traces, Mode=OneWay}" UndoLimit="0" IsUndoEnabled="False" Margin="5"
VerticalScrollBarVisibility="Auto" FontSize="10" TextChanged="OnTextBoxTextChanged" HorizontalScrollBarVisibility="Auto"
BorderBrush="{DynamicResource AccentColorBrush}"/>
此外,我在后面的代码中做了一些事情,当字符串更新时,向下滚动文本框,以便我可以看到最后一个字符串被附加
Code Behind
private void OnTextBoxTextChanged(object sender, TextChangedEventArgs e)
{
TracesTextBox.CaretIndex = TracesTextBox.Text.Length;
TracesTextBox.ScrollToEnd();
}
这段代码由后台线程执行,后者线程从以太网
获取数据 ViewModel Code Invoked by Background thread
var str =((float)(msg.ArrivalTimeMs / 1000.0)).ToString("00000.000").PadRight(16, ' ') ;
str+= msg.Bytes.Take(msg.len).Aggregate(str, (current, dataByte) => current + (dataByte.ToString("X").PadLeft(2, '0') + " ")) + "\n";
UiTaskFactory.StartNew(() =>
{
Traces += str;
}
);
问题是,在运行应用程序几个小时后,Traces中的文本量变得非常大,UI根本不响应滚动。
现在,我如何在字符串的开头执行某种剥离并保留我收到的最后一千行?我想这将花费在处理器使用方面。如果我从以太网接收的消息较少,则滚动响应非常快。我想过使用字符串队列,但是有没有更优雅的解决方案来处理数千行字符串?