using System.Collections.ObjectModel; using System.Windows.Threading; namespace SSPCTester.UI.Services; /// /// UI 日志接收器:把日志事件投递到 UI 线程的 ObservableCollection,供日志面板绑定。 /// public sealed class UiLogSink { private readonly Dispatcher _dispatcher = Dispatcher.CurrentDispatcher; public ObservableCollection Entries { get; } = new(); public int MaxEntries { get; set; } = 500; public void Add(UiLogLevel level, string message) { var entry = new LogEntry(DateTime.Now, level, message); if (_dispatcher.CheckAccess()) Append(entry); else _dispatcher.BeginInvoke(() => Append(entry)); } private void Append(LogEntry entry) { Entries.Add(entry); while (Entries.Count > MaxEntries) Entries.RemoveAt(0); } } public enum UiLogLevel { Info, Success, Warning, Error } public sealed record LogEntry(DateTime Time, UiLogLevel Level, string Message) { public string TimeText => Time.ToString("HH:mm:ss.fff"); }