using System;
|
using System.Collections.Generic;
|
using System.Collections.ObjectModel;
|
using System.ComponentModel;
|
using System.Linq;
|
using System.Runtime.CompilerServices;
|
using System.Text;
|
using System.Threading.Tasks;
|
using System.Windows;
|
using System.Windows.Controls;
|
using System.Windows.Media;
|
using SmartScanner;
|
|
namespace SmartScanner.ViewModel
|
{
|
public class LogEntry : INotifyPropertyChanged
|
{
|
private DateTime _timestamp;
|
public DateTime Timestamp
|
{
|
get => _timestamp;
|
set
|
{
|
_timestamp = value;
|
OnPropertyChanged();
|
}
|
}
|
|
private string _level;
|
public string Level
|
{
|
get => _level;
|
set
|
{
|
_level = value;
|
OnPropertyChanged();
|
}
|
}
|
|
private string _message;
|
public string Message
|
{
|
get => _message;
|
set
|
{
|
_message = value;
|
OnPropertyChanged();
|
}
|
}
|
|
private Brush _foreground;
|
public Brush Foreground
|
{
|
get => _foreground;
|
set
|
{
|
_foreground = value;
|
OnPropertyChanged();
|
}
|
}
|
|
public event PropertyChangedEventHandler PropertyChanged;
|
|
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
|
{
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
}
|
}
|
|
public class EnhancedLogViewModel : INotifyPropertyChanged
|
{
|
public ObservableCollection<LogEntry> LogEntries { get; } = new ObservableCollection<LogEntry>();
|
private static readonly Lazy<EnhancedLogViewModel> _instance =
|
new Lazy<EnhancedLogViewModel>(() => new EnhancedLogViewModel());
|
|
public static EnhancedLogViewModel Instance => _instance.Value;
|
|
// 日志自动保存服务
|
private LogAutoSaveService _logAutoSaveService;
|
|
private EnhancedLogViewModel()
|
{
|
// 初始化日志自动保存服务
|
_logAutoSaveService = new LogAutoSaveService(LogEntries);
|
}
|
|
// 添加对ScrollViewer的引用
|
private ScrollViewer _logScrollViewer;
|
public ScrollViewer LogScrollViewer
|
{
|
get => _logScrollViewer;
|
set
|
{
|
_logScrollViewer = value;
|
OnPropertyChanged();
|
}
|
}
|
|
public void AddLog(string message, string level = "INFO")
|
{
|
Application.Current.Dispatcher.Invoke(() =>
|
{
|
var entry = new LogEntry
|
{
|
Timestamp = DateTime.Now,
|
Level = level,
|
Message = message,
|
Foreground = GetLevelColor(level)
|
};
|
|
LogEntries.Add(entry);
|
|
// 限制日志数量
|
if (LogEntries.Count > 500)
|
{
|
LogEntries.RemoveAt(0);
|
}
|
|
// 通知自动保存服务有新日志,传递LogEntry对象
|
_logAutoSaveService?.LogAdded(entry);
|
|
// 滚动到底部
|
ScrollToBottom();
|
});
|
}
|
|
/// <summary>
|
/// 手动保存当前日志
|
/// </summary>
|
public void SaveLogs()
|
{
|
_logAutoSaveService?.ForceSave();
|
}
|
|
/// <summary>
|
/// 停止日志自动保存服务
|
/// </summary>
|
public void StopAutoSaveService()
|
{
|
_logAutoSaveService?.Stop();
|
_logAutoSaveService = null;
|
}
|
|
/// <summary>
|
/// 获取自动保存服务状态
|
/// </summary>
|
public string GetAutoSaveStatus()
|
{
|
return _logAutoSaveService?.GetStatus() ?? "自动保存服务未运行";
|
}
|
|
private void ScrollToBottom()
|
{
|
if (LogScrollViewer != null)
|
{
|
LogScrollViewer.ScrollToEnd();
|
}
|
}
|
|
private Brush GetLevelColor(string level)
|
{
|
switch (level)
|
{
|
case "ERROR":
|
return Brushes.Red;
|
case "WARN":
|
return Brushes.Orange;
|
case "DEBUG":
|
return Brushes.Blue;
|
default:
|
return Brushes.Black;
|
}
|
}
|
|
public event PropertyChangedEventHandler PropertyChanged;
|
|
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
|
{
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
}
|
}
|
}
|