如何在WPF中处理/编辑大量文本?

时间:2009-04-30 14:56:32

标签: wpf performance text

使用WPF显示和编辑大量未格式化文本(就像notepade一样)的好方法是什么?将大字符串加载到TextBox会使UI无响应。整体性能与以前的Microsoft UI框架的TextBox Controls几乎没有可比性。

我有什么选择来解决这个问题。我不想在文本控件加载文本时阻止UI线程。此外,我可能需要某种“虚拟化”,因为将整个文本加载到控件中可能不是一个好主意(我想即使它们不可见,20MB的文本也会创建很多字形)。似乎TextBox甚至没有AppenText()方法,所以我甚至没有办法控制文本的异步加载。

这不是一个常见的问题吗?似乎WPF没有提供任何开箱即用的东西。为什么会这样?

9 个答案:

答案 0 :(得分:3)

我不确定这是否有帮助,但您是否尝试过使用FlowDocumentPageViewerFlowDocumentReader

它还具有非常好的注释支持,看起来非常适合以文本格式加载文档。

答案 1 :(得分:2)

问题是TextBox是一个单独的容器元素。由于容器回收,列表控件(例如ListBox)非常好地虚拟化。你真的没有什么简单的东西可以加速TextBox。

但是TextBox控件确实有一个AppendText()方法:

        TextBox tb = new TextBox();
        tb.AppendText("Hello");

所以,是的,您可以使用它动态添加一些文字,就像您提到的那样。

答案 2 :(得分:1)

您可以使用带有样式的文本框,为用户提供更多空间来查看文本。 Telerik和其他人可能有更多高级控件,但如果你不需要编辑选项就足够了。

答案 3 :(得分:1)

您可以始终混合和匹配技术:您可以将WinForms TextBox放到WPF父级上。你会丢失样式,不透明度,动画,变换等等,但如果重要的是编辑文本,WinForms TextBox就可以了。

答案 4 :(得分:1)

您是否尝试过WPF RichTextBox?如果你走这条路,你肯定想要阅读FlowDocument信息。

答案 5 :(得分:1)

SharpDevelop中的文本编辑器AvalonEdit在WPF中完全从头开始编写,并针对大量文本进行了优化。它不支持富文本(虽然它支持语法高亮和其他很酷的功能,如折叠)。我认为这可能完全适合你的账单。

以下是开发人员撰写的关于编辑器的文章:

http://www.codeproject.com/KB/edit/AvalonEdit.aspx

答案 6 :(得分:0)

您可以使用 FlowDocument ,但这不能用于绑定到MVVM中 FlowDocument Document 属性

另一个解决方案是使用 FlowDocumentScrollViewer 并绑定到其 Document 属性。

(或者您甚至可以使用 FlowDocumentReader 并绑定其 Document 属性,类似于 FlowDocumentScrollViewer 。这为您提供了不同的UI。 )

观点:

 <FlowDocumentScrollViewer Document="{Binding FlowDocument, Mode=OneWay}" />

ViewModel:

   FlowDocument fd = new FlowDocument();
        Paragraph p = new Paragraph();
        Run r = new Run();
        r.Text = "large text";
        p.Inlines.Add(r);
        fd.Blocks.Add(p);
        FlowDocument = fd;

 private FlowDocument _FlowDocument;
    public FlowDocument FlowDocument
    {
      get{ return _FlowDocument; }
      set
      {
        _FlowDocument = value;
        NotifyOfPropertyChange(nameof(FlowDocument));
      }
    }

另见性能提示:https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/optimizing-performance-text#flowdocument-textblock-and-label-controls

答案 7 :(得分:0)

另一个选择是使用Scintilla.NET。到目前为止,我对大量文本的表现最佳。加载大文件几乎是瞬间的。即使它是WinForms控件,也可以使用WindowsFormsHost容器将其嵌入到WPF窗口中。有语法高亮显示和一些其他功能应该足以显示未格式化的文本。从不利方面看-由于这是WinForms控件,因此它与其他WPF UI元素重叠。调整控件的大小也可能存在问题。不幸的是,没有比使用非WPF控件代替默认的TextBox和RichTextBox更好的选择了。

答案 8 :(得分:-1)

尝试这样的事情怎么样:

将整个字符串保留在内存中,但在文本框中只显示它的“切片”。切片字符串的大小将根据文本框的大小,字体大小等动态计算。

当然,这涉及到许多非常简单的代码,无法正确显示,同步等等,但似乎还有很长的路要走。