题
使用WPF显示和编辑大量未格式化文本(就像notepade一样)的好方法是什么?将大字符串加载到TextBox会使UI无响应。整体性能与以前的Microsoft UI框架的TextBox Controls几乎没有可比性。
我有什么选择来解决这个问题。我不想在文本控件加载文本时阻止UI线程。我也可能需要某种“虚拟化”功能。因为将整个文本加载到控件中可能不是一个好主意(我想即使它们不可见,20MB的文本也会创建很多字形)。似乎TextBox甚至没有AppenText()方法,所以我甚至没有办法控制文本的异步加载。
这不是一个常见的问题吗?似乎WPF没有提供任何开箱即用的东西。为什么会这样?
解决方案
以下是开发人员撰写的关于编辑器的文章:
其他提示
我不确定这是否有帮助,但您是否尝试使用 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));
}
}
尝试这样的事情怎么样:
将整个字符串保留在内存中,但在文本框中只显示它的“切片”。切片字符串的大小将根据文本框的大小,字体大小等动态计算。
当然,这涉及到许多非常简单的代码,无法正确显示,同步等等,但似乎还有很长的路要走。