C3032
2025-12-20 d0ded5cd9bf5070a120bad58b5be21fe2ac6a4ff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
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));
        }
    }
}