当我在 TextBox 中加载大约 100KB 的文本时,它开始变得非常缓慢。 比如滚动等等。就是感觉很糟糕。
是否有任何相当简单的解决方法?
我希望能够加载高达一兆字节的文本,而滚动时不会出现巨大的延迟。
除了滚动之外,选择文本或编辑文本也存在问题,它也变得非常缓慢且不舒服。
TextBox
没有虚拟化,因此并不是真正设计用于支持大量文本。您将需要使用不同类型的控件,并可能考虑您的大量文本是否真的需要只是一个字符串:是否可以将其分解为有意义的更小的对象?
RichTextBox
、ListBox
或 DataGrid
都是您应该使用的控件类型的良好候选者 - 取决于您想要做什么以及您可以将文本分成多少部分。
也许您可以使用
ItemsControl
尝试一种快速且廉价的解决方案,假设 - 正如我之前的其他人所做的那样 - 您的文本被分成更小的块。
<ItemsControl
ItemsSource="{Binding Path=Paragraphs}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding Mode=TwoWay}" BorderThickness="0"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanelTemplate>
<VirtualizingStackPanel/>
</ItemsControl.ItemsPanelTemplate>
</ItemsControl>
您可能需要剥离
TextBox
模板(鼠标悬停状态等)
您需要使用具有虚拟化功能的控件,也许是数据网格,因为您需要数据可编辑。
将数据分割成更小的块也会更好。
我遇到过这种缓慢滚动 TextBlock 的情况(即使我使用的是 .net 8!)。我切换到RichTextBlock,问题就消失了。
为了简化大型应用程序的工作(这导致 Visual Studio 中出现多个错误),我创建了以下两个函数:
public static void SetRichTextBoxText(RichTextBox richTextBox, string newText, bool append = false)
{
if (append)
{
// Append the new text to the existing content
System.Windows.Documents.Paragraph paragraph = new System.Windows.Documents.Paragraph(new Run(newText));
paragraph.Margin = new Thickness(0); // Set margin to 0
paragraph.Padding = new Thickness(0);
richTextBox.Document.Blocks.Add(paragraph);
}
else
{
// Replace the existing content with the new text
richTextBox.Document.Blocks.Clear(); // Clear existing content
System.Windows.Documents.Paragraph paragraph = new System.Windows.Documents.Paragraph(new Run(newText));
paragraph.Margin = new Thickness(0); // Set margin to 0
paragraph.Padding = new Thickness(0);
richTextBox.Document.Blocks.Add(paragraph);
}
}
public static string GetRichTextBoxText(RichTextBox richTextBox)
{
return new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd).Text;
}