【发布时间】:2017-08-04 16:56:53
【问题描述】:
我正在开发一个 C#/Xaml UWP 文本编辑应用程序,它使用 RichEditBox 控件来编辑文本文件。但是,我注意到当我加载较大的文件(约 1mb 及以上,甚至可能更少)时,控制在几个关键领域会遇到困难:1)加载文件内容需要一段时间,2)一旦加载终于有了,滚动非常生涩,输入文件既不流畅也不响应。
我遇到的最接近的答案是this(它所描述的正是我遇到的问题),但它似乎不适用于 UWP 应用。
编辑:
当我打开一个文件时,要分享的值得注意的代码是:
_currentFile.Content = await readFile(file);
_currentFile._richeditbox.Document.SetText(TextSetOptions.None, _currentFile.Content);
这是 readFile() 函数,通过 https://social.msdn.microsoft.com/Forums/sqlserver/en-US/0f3cd056-a2e3-411b-8e8a-d2109255359a/uwpc-reading-ansi-text-file?forum=wpdevelop 得到帮助:
private async Task<string> readFile(StorageFile file)
{
string charSet = null;
try
{
await Task.Run(() =>
{
try
{
using (FileStream fs = System.IO.File.OpenRead(file.Path))
{
Ude.CharsetDetector cdet = new Ude.CharsetDetector();
cdet.Feed(fs);
cdet.DataEnd();
charSet = cdet.Charset;
}
}
catch (Exception ex)
{
}
});
}
catch (Exception e)
{
}
Classes.File._lastEncoding = charSet;
IBuffer buffer = await FileIO.ReadBufferAsync(file);
DataReader reader = DataReader.FromBuffer(buffer);
byte[] fileContent = new byte[reader.UnconsumedBufferLength];
reader.ReadBytes(fileContent);
string content = "";
if (charSet == "windows-1252")
{
content = Encoding.GetEncoding("iso-8859-1").GetString(fileContent, 0, fileContent.Length);
}
else if (charSet == "UTF-16LE")
{
content = Encoding.Unicode.GetString(fileContent, 0, fileContent.Length);
}
else if (charSet == "UTF-16BE")
{
content = Encoding.BigEndianUnicode.GetString(fileContent, 0, fileContent.Length);
}
else
{
content = Encoding.UTF8.GetString(fileContent, 0, fileContent.Length);
}
return content;
}
调试时,调用readFile()函数绝对没有延迟;它执行得非常快。
我尝试加载一个 1.14mb 的文本文件。加载需要一些时间,当它加载时,虽然滚动条高度表明它已全部加载,但实际上从第 2098 行开始并没有显示任何文本(总共有 3,771 行);即使在后续重新加载时,它也会始终停在这一行。
看图:
您还可以看到,可见的最后一行与上面的行混在一起。
作为参考,我遇到问题的文件可以从这里下载(但要明确的是,所有类似大小的文本文件都有问题,甚至可能更小):http://mtrostyle.net/appytext/testfile.txt。
【问题讨论】:
-
我尝试加载一个 138M 大小的 rtf 文件。但是,我无法重现您的问题。你能分享更多关于如何加载文件的代码吗?
-
我已经更新了值得注意的代码和其他信息。感谢您查看此 Nico,非常感谢。
标签: c# performance xaml uwp richeditbox