using System; using System.Collections.ObjectModel; using System.Linq; using System.Windows; using DeviceService.Logging; namespace DeviceService; /// /// 日志窗口:展示 MemoryAppender 内存缓冲中的最近 1000 条日志,并实时追加新日志。 /// public partial class LogWindow : Window { private readonly ObservableCollection _entries = new ObservableCollection(); public LogWindow() { InitializeComponent(); LogList.ItemsSource = _entries; Loaded += LogWindow_Loaded; Closed += LogWindow_Closed; } private void LogWindow_Loaded(object sender, RoutedEventArgs e) { foreach (LogEntry entry in MemoryAppender.Current.Snapshot) { _entries.Add(entry); } UpdateCount(); MemoryAppender.Current.EntryAppended += OnEntryAppended; ScrollToEnd(); } private void OnEntryAppended(LogEntry entry) { // 日志事件可能来自后台线程,切回 UI 线程更新列表 Dispatcher.BeginInvoke(new Action(() => { _entries.Add(entry); while (_entries.Count > MemoryAppender.Current.Capacity) { _entries.RemoveAt(0); } UpdateCount(); ScrollToEnd(); })); } private void ClearButton_Click(object sender, RoutedEventArgs e) { MemoryAppender.Current.Clear(); _entries.Clear(); UpdateCount(); } private void UpdateCount() { CountText.Text = $"共 {_entries.Count} 条(最多保留 {MemoryAppender.Current.Capacity} 条)"; } private void ScrollToEnd() { if (AutoScrollBox.IsChecked == true && _entries.Count > 0) { LogList.ScrollIntoView(_entries.Last()); } } private void LogWindow_Closed(object? sender, EventArgs e) { MemoryAppender.Current.EntryAppended -= OnEntryAppended; } }