我正在开发一个 C#/Xaml UWP 文本编辑应用程序,它使用 RichEditBox 控件来编辑文本文件。但是,我注意到当我加载较大的文件(约 1mb 及以上,甚至可能更少)时,控制在几个关键领域会遇到困难:1)加载文件内容需要一段时间,2)一旦加载终于有了,滚动非常生涩,输入文件既不流畅也不响应。
我遇到的最接近的答案是这个(它所描述的正是我遇到的问题),但它似乎不适用于 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-得到帮助文件?论坛=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。