C#中使用哪个WPF控件来显示文本文件?

3
什么是在WPF应用程序中加载大文本文件的最佳控件?而且这并不仅仅是简单的事情,我需要能够突出显示/更改某些行的背景颜色。我想使用RichTextBox..但我想来问问其他人的想法。
我不需要编辑文本,只需突出显示带有错误的行。
编辑:啊,我忘了提到,文本文件内容由程序处理,该程序将更改某些行的背景颜色。当程序无法找到某些错误行时,也可以给用户一个更改的机会。
编辑2:该应用程序用于解析日志文件,因此文件可能很大,超过50,000行。

RichTextbox有为您的要求提供现成的功能。但是,当您在超过5Mb的文件中进行样式设置时,它的性能相当糟糕。它没有内置的虚拟模式。也许您可以扩展它以满足您的需求。如果您打算使用它,请首先确保您对其性能感到满意。我不确定是否有任何.NET控件可推荐用于大型文本文件处理和样式设置。 - CharithJ
是的,你说得很对,我这里有一个1MB的文件进行测试,它已经需要太长时间才能加载到RichTextBox中了。还有什么其他的解决方案可以使用来提高速度呢? - hs2d
你想使用的最大文件大小是多少?我不确定是否可以优化以使用大型文本文件。关闭它不需要的功能,如拼写检查,然后看看。 - CharithJ
DocumentViewer对你来说也是一个合适的控件。虽然我从未使用过它,但你可以试试看。如果不行的话,我认为你需要找其他第三方控件(据我所知)。 - CharithJ
这个怎么样:http://www.textpad.com/support/faq/csharp.html - CharithJ
@CharithJ,我认为最大值应该在2MB左右,不会更多。 - hs2d
2个回答

2
我不确定您是想要展示文件还是允许用户编辑它们。
无论哪种方式,可能ScintillaNET会对您有用。
著名的文本编辑器Notepad++使用Scintilla:)
您可以在http://sourceforge.net/projects/notepad-plus/上获取Notepad++源代码,但它是用C++编写的,因此API与.NET有些不同。
编辑
Notepad++能够显示大约100-200MB左右的文件。如果您需要更好的效果,则需要实现某种分页技术/虚拟模式(不要加载整个文件,仅加载当前滚动条位置所显示的部分)。
如果Scintilla看起来过于复杂,那么也许你最好只是建立一个DataGrid。如果日志条目包含多个字段,则这些字段可以成为列,并且会更容易阅读。如果您想走这条路,请先将日志文件解析为LogEntry列表,然后使用数据绑定进行绑定。您可以逐步读取文件,以便在添加新行时获得更好的用户体验。

实际上我不需要编辑它们,只想用一些高亮的行来显示它们。 - hs2d
我刚刚查看了ScintillaNET codeplex控件。听起来非常不错。我认为这是一个值得尝试的好控件。 - CharithJ
实际上,它应该在VS2010中工作:http://scintillanet.codeplex.com/wikipage?title=Installation。不过它是一个WinForms控件,所以你需要像这个链接中一样将它包含在WindowsFormsHost中:http://www.switchonthecode.com/tutorials/wpf-tutorial-using-winforms-in-wpf - surfen
1
@hs2d 我见过有人建议使用AvalonEdit而不是ScintillaNET(我自己没有用过)。 它是纯WPF,并且在SharpDevelop中使用。 http://wiki.sharpdevelop.net/AvalonEdit.ashx - surfen
@surfen,谢谢。我正在测试AvalonEdit,它可以在瞬间加载我的1MB文件。现在我只需要看看它是否符合我的其他需求。(: - hs2d

1

我认为在这种情况下,RichTextBox将是最合适的选择,但正如CharithJ所说,您不能一次性将整个日志加载到其中,这将会导致性能损失太大。

如果我遇到这种情况,我会使用一个带有两个小的向上和向下滚动按钮的Richtextbox。我每次只会加载一些日志文本,比如x个字符。一旦用户点击向上或向下滚动按钮,我会根据用户点击的按钮(向上或向下)从开头和结尾删除一些文本,并基于此从richbox中删除一些文本并追加一些其他文本。

您可以像我上面建议的那样做,也可以通过扩展RichTextBox控件并实现仅向RichTextBox传递有限文本以进行显示的逻辑来实现。您可以处理与滚动相关的事件来更改RichTextBox的内容。


是的,这是使它更快的唯一方法。但它可能会使您的文本高亮逻辑变得相当复杂,而且实现起来并不容易(至少对我来说不容易)。 - CharithJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接