首先上截图,(搭配MaterialDesign,此外日志是可多行复制的)这个文件大概10万行,18MB,加载速度可自己调节,看GetLog()方法里面的maxSteps
话不多说直接开始:
XAML:
<DataGrid
HeadersVisibility="None"
IsReadOnly="True"
ItemsSource="{Binding MainModel.LogLines}"
VirtualizingStackPanel.VirtualizationMode="Recycling">
<DataGrid.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding LineText}"/>
</DataTemplate>
</DataGrid.ItemTemplate>
</DataGrid>
Model类:
private List<LogData> logLines = new List<LogData>();
public List<LogData> LogLines
{
get { return logLines; }
set { logLines = value; DoNotify(); }
}
public MainModel()
{
//加载日志
LoadLogAsync();
}
private async void LoadLogAsync()
{
LogLines = await Logger.GetLog();
}
//LogData类:
public class LogData : NotifyBase
{
private string lineText;
public string LineText
{
get { return lineText; }
set { lineText = value; DoNotify(); }
}
}
GetLog()方法:实测maxSteps=500大概14s,5000的话就2-3s,还是很快的
public static async Task<List<LogData>> GetLog()
{
List<LogData> MyLogLines = new List<LogData>();
await Task.Run(() =>
{
int currentLine = 0;
//一次读取的行数,看你自己配置
int maxSteps = 500;
int size = -1;
IEnumerable<string> selectLines;
IEnumerator<string> enumerator;
while (size != 0)
{
selectLines = File.ReadLines(AppDomain.CurrentDomain.BaseDirectory + "Test.log", Encoding.UTF8).Skip(currentLine).Take(maxSteps);
currentLine += maxSteps;
enumerator = selectLines.GetEnumerator();
size = selectLines.Count();
while (enumerator.MoveNext())
{
MyLogLines.Add(new LogData() { LineText = enumerator.Current });
}
}
});
return MyLogLines;
}