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;
}
}