alielie
7 天以前 e57938fbda9bff702004038f76d009422968bff5
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
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;
    }
}