using System;
|
using System.Collections.ObjectModel;
|
using System.Linq;
|
using System.Windows;
|
using DeviceService.Logging;
|
|
namespace DeviceService;
|
|
/// <summary>
|
/// 日志窗口:展示 MemoryAppender 内存缓冲中的最近 1000 条日志,并实时追加新日志。
|
/// </summary>
|
public partial class LogWindow : Window
|
{
|
private readonly ObservableCollection<LogEntry> _entries = new ObservableCollection<LogEntry>();
|
|
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;
|
}
|
}
|