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 LogEntries { get; } = new ObservableCollection(); private static readonly Lazy _instance = new Lazy(() => 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(); }); } /// /// 手动保存当前日志 /// public void SaveLogs() { _logAutoSaveService?.ForceSave(); } /// /// 停止日志自动保存服务 /// public void StopAutoSaveService() { _logAutoSaveService?.Stop(); _logAutoSaveService = null; } /// /// 获取自动保存服务状态 /// 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)); } } }