使用WPF显示和编辑大量未格式化文本(就像notepade一样)的好方法是什么?将大字符串加载到TextBox会使UI无响应。整体性能与以前的Microsoft UI框架的TextBox Controls几乎没有可比性。
我有什么选择来解决这个问题。我不想在文本控件加载文本时阻止UI线程。此外,我可能需要某种“虚拟化”,因为将整个文本加载到控件中可能不是一个好主意(我想即使它们不可见,20MB的文本也会创建很多字形)。似乎TextBox甚至没有AppenText()方法,所以我甚至没有办法控制文本的异步加载。
这不是一个常见的问题吗?似乎WPF没有提供任何开箱即用的东西。为什么会这样?
答案 0 :(得分:3)
我不确定这是否有帮助,但您是否尝试过使用FlowDocumentPageViewer和FlowDocumentReader?
它还具有非常好的注释支持,看起来非常适合以文本格式加载文档。
答案 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)
以下是开发人员撰写的关于编辑器的文章:
答案 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));
}
}
答案 7 :(得分:0)
另一个选择是使用Scintilla.NET。到目前为止,我对大量文本的表现最佳。加载大文件几乎是瞬间的。即使它是WinForms控件,也可以使用WindowsFormsHost容器将其嵌入到WPF窗口中。有语法高亮显示和一些其他功能应该足以显示未格式化的文本。从不利方面看-由于这是WinForms控件,因此它与其他WPF UI元素重叠。调整控件的大小也可能存在问题。不幸的是,没有比使用非WPF控件代替默认的TextBox和RichTextBox更好的选择了。
答案 8 :(得分:-1)
尝试这样的事情怎么样:
将整个字符串保留在内存中,但在文本框中只显示它的“切片”。切片字符串的大小将根据文本框的大小,字体大小等动态计算。
当然,这涉及到许多非常简单的代码,无法正确显示,同步等等,但似乎还有很长的路要走。