文本框滚动速度太慢,其中包含相当大的文本 - 有什么办法吗?

问题描述 投票:0回答:4

当我在 TextBox 中加载大约 100KB 的文本时,它开始变得非常缓慢。 比如滚动等等。就是感觉很糟糕。

是否有任何相当简单的解决方法?

我希望能够加载高达一兆字节的文本,而滚动时不会出现巨大的延迟。

除了滚动之外,选择文本或编辑文本也存在问题,它也变得非常缓慢且不舒服。

silverlight silverlight-4.0
4个回答
2
投票

TextBox
没有虚拟化,因此并不是真正设计用于支持大量文本。您将需要使用不同类型的控件,并可能考虑您的大量文本是否真的需要只是一个字符串:是否可以将其分解为有意义的更小的对象?

RichTextBox
ListBox
DataGrid
都是您应该使用的控件类型的良好候选者 - 取决于您想要做什么以及您可以将文本分成多少部分。


1
投票

也许您可以使用

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
模板(鼠标悬停状态等)


0
投票

您需要使用具有虚拟化功能的控件,也许是数据网格,因为您需要数据可编辑。

将数据分割成更小的块也会更好。


0
投票

我遇到过这种缓慢滚动 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.