@@ -20,6 +20,10 @@ namespace LLCOM.Views;
20
20
21
21
public partial class TerminalView : UserControl
22
22
{
23
+ private DispatcherTimer _updateTimer ;
24
+ private bool _dataChanged = false ;
25
+ readonly List < List < TerminalBlock > > _terminalBlocks = [ ] ;
26
+
23
27
public TerminalView ( )
24
28
{
25
29
InitializeComponent ( ) ;
@@ -34,11 +38,49 @@ protected override void OnUnloaded(RoutedEventArgs e)
34
38
MainArea . PropertyChanged -= MainArea_PropertyChanged ;
35
39
Utils . Setting . TerminalChangedEvent -= TerminalChangedEvent ;
36
40
( ( TerminalViewModel ) DataContext ! ) . TerminalChangedEvent -= TerminalChangedEvent ;
41
+ _updateTimer . Stop ( ) ;
37
42
Debug . WriteLine ( "TerminalView unloaded." ) ;
38
43
}
39
44
40
45
private void Control_OnLoaded ( object ? sender , RoutedEventArgs e )
41
46
{
47
+ //搞个定时器来更新UI,防止阻塞
48
+ _updateTimer = new DispatcherTimer
49
+ {
50
+ Interval = TimeSpan . FromMilliseconds ( 100 )
51
+ } ;
52
+ _updateTimer . Tick += ( s , e ) =>
53
+ {
54
+ if ( _dataChanged )
55
+ {
56
+ lock ( _terminalBlocks )
57
+ {
58
+ // 执行更新逻辑
59
+ //清空文本
60
+ MainTextBlock . Inlines ! . Clear ( ) ;
61
+ foreach ( var line in _terminalBlocks )
62
+ {
63
+ foreach ( var block in line )
64
+ {
65
+ //添加块
66
+ var run = new Run ( block . Text )
67
+ {
68
+ [ ! Span . ForegroundProperty ] = new Binding ( block . ForegroundBindingName ) { Source = Utils . Setting } ,
69
+ [ ! Span . BackgroundProperty ] = new Binding ( block . BackgroundBindingName ) { Source = Utils . Setting } ,
70
+ FontWeight = block . IsBold ? FontWeight . Bold : FontWeight . Normal ,
71
+ FontStyle = block . IsItalic ? FontStyle . Italic : FontStyle . Normal ,
72
+ TextDecorations = block . IsUnderLine ? TextDecorations . Underline : null ,
73
+ } ;
74
+ MainTextBlock . Inlines . Add ( run ) ;
75
+ }
76
+ MainTextBlock . Inlines . Add ( new LineBreak ( ) ) ;
77
+ }
78
+ }
79
+ _dataChanged = false ; // 重置标记
80
+ }
81
+ } ;
82
+ _updateTimer . Start ( ) ;
83
+
42
84
Utils . Setting . TerminalChangedEvent += TerminalChangedEvent ;
43
85
( ( TerminalViewModel ) DataContext ! ) . TerminalChangedEvent += TerminalChangedEvent ;
44
86
//加载完触发一次,顺便初始化窗口大小数据
@@ -80,27 +122,19 @@ private void MainScrollBar_OnScroll(object? sender, ScrollEventArgs e)
80
122
81
123
private void TerminalChangedEvent ( object ? sender , List < List < TerminalBlock > > e )
82
124
{
83
- Dispatcher . UIThread . Invoke ( ( ) =>
125
+ lock ( _terminalBlocks )
84
126
{
85
- //清空文本
86
- MainTextBlock . Inlines ! . Clear ( ) ;
127
+ _terminalBlocks . Clear ( ) ;
87
128
foreach ( var line in e )
88
129
{
130
+ var newLine = new List < TerminalBlock > ( ) ;
89
131
foreach ( var block in line )
90
132
{
91
- //添加块
92
- var run = new Run ( block . Text )
93
- {
94
- [ ! Span . ForegroundProperty ] = new Binding ( block . ForegroundBindingName ) { Source = Utils . Setting } ,
95
- [ ! Span . BackgroundProperty ] = new Binding ( block . BackgroundBindingName ) { Source = Utils . Setting } ,
96
- FontWeight = block . IsBold ? FontWeight . Bold : FontWeight . Normal ,
97
- FontStyle = block . IsItalic ? FontStyle . Italic : FontStyle . Normal ,
98
- TextDecorations = block . IsUnderLine ? TextDecorations . Underline : null ,
99
- } ;
100
- MainTextBlock . Inlines . Add ( run ) ;
133
+ newLine . Add ( ( TerminalBlock ) block . Clone ( ) ) ;
101
134
}
102
- MainTextBlock . Inlines . Add ( new LineBreak ( ) ) ;
135
+ _terminalBlocks . Add ( newLine ) ;
103
136
}
104
- } ) ;
137
+ }
138
+ _dataChanged = true ;
105
139
}
106
140
}
0 commit comments