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

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

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

有帮助吗?

解决方案

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

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

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

其他提示

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

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

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

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

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

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

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

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

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

您可以使用 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

尝试这样的事情怎么样:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top