搭配MaterialDesign以虚拟化的方式实现文本日志加载

 首先上截图,(搭配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;
}

​

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值