@@ -42,7 +42,6 @@ public class EnhancedScrollBar : IDisposable
42
42
readonly TextEditor editor ;
43
43
readonly TextMarkerService textMarkerService ;
44
44
readonly IChangeWatcher changeWatcher ;
45
- TrackBackground trackBackground ;
46
45
TrackAdorner trackAdorner ;
47
46
48
47
public EnhancedScrollBar ( TextEditor editor , TextMarkerService textMarkerService , IChangeWatcher changeWatcher )
@@ -62,10 +61,6 @@ public EnhancedScrollBar(TextEditor editor, TextMarkerService textMarkerService,
62
61
public void Dispose ( )
63
62
{
64
63
editor . Loaded -= editor_Loaded ;
65
- if ( trackBackground != null ) {
66
- trackBackground . Remove ( ) ;
67
- trackBackground = null ;
68
- }
69
64
if ( trackAdorner != null ) {
70
65
trackAdorner . Remove ( ) ;
71
66
trackAdorner = null ;
@@ -86,78 +81,19 @@ void editor_Loaded(object sender, RoutedEventArgs e)
86
81
return ;
87
82
scrollViewer . ApplyTemplate ( ) ;
88
83
var vScrollBar = ( ScrollBar ) scrollViewer . Template . FindName ( "PART_VerticalScrollBar" , scrollViewer ) ;
89
- var hScrollBar = ( ScrollBar ) scrollViewer . Template . FindName ( "PART_HorizontalScrollBar" , scrollViewer ) ;
90
- // make both scrollbars transparent so that they look consistent
91
- MakeThumbTransparent ( vScrollBar ) ;
92
- MakeThumbTransparent ( hScrollBar ) ;
93
84
if ( vScrollBar == null )
94
85
return ;
95
86
Track track = ( Track ) vScrollBar . Template . FindName ( "PART_Track" , vScrollBar ) ;
96
87
if ( track == null )
97
88
return ;
98
89
Grid grid = VisualTreeHelper . GetParent ( track ) as Grid ;
99
- if ( grid != null ) {
100
- trackBackground = new TrackBackground ( this ) ;
101
- trackAdorner = new TrackAdorner ( this ) ;
102
- Grid . SetColumn ( trackBackground , Grid . GetColumn ( track ) ) ;
103
- Grid . SetRow ( trackBackground , Grid . GetRow ( track ) ) ;
104
- Grid . SetColumnSpan ( trackBackground , Grid . GetColumnSpan ( track ) ) ;
105
- Grid . SetRowSpan ( trackBackground , Grid . GetRowSpan ( track ) ) ;
106
- Grid . SetColumn ( trackAdorner , Grid . GetColumn ( track ) ) ;
107
- Grid . SetRow ( trackAdorner , Grid . GetRow ( track ) ) ;
108
- Grid . SetColumnSpan ( trackAdorner , Grid . GetColumnSpan ( track ) ) ;
109
- Grid . SetRowSpan ( trackAdorner , Grid . GetRowSpan ( track ) ) ;
110
- Panel . SetZIndex ( track , 1 ) ;
111
- Panel . SetZIndex ( trackAdorner , 2 ) ;
112
- grid . Children . Add ( trackBackground ) ;
113
- grid . Children . Add ( trackAdorner ) ;
114
- }
115
- }
116
- #endregion
117
-
118
- #region MakeThumbTransparent
119
- List < Thumb > transparentThumbs = new List < Thumb > ( ) ;
120
- const double thumbOpacity = 0.7 ;
121
- static readonly Duration animationDuration = new Duration ( TimeSpan . FromSeconds ( 0.25 ) ) ;
122
-
123
- void MakeThumbTransparent ( ScrollBar scrollBar )
124
- {
125
- if ( scrollBar == null )
90
+ if ( grid == null )
126
91
return ;
127
- Track track = ( Track ) scrollBar . Template . FindName ( "PART_Track" , scrollBar ) ;
128
- if ( track == null )
92
+ var layer = AdornerLayer . GetAdornerLayer ( grid ) ;
93
+ if ( layer == null )
129
94
return ;
130
- for ( int i = 0 ; i < VisualTreeHelper . GetChildrenCount ( track ) ; i ++ ) {
131
- var thumb = VisualTreeHelper . GetChild ( track , i ) as Thumb ;
132
- if ( thumb != null ) {
133
- thumb . Opacity = thumbOpacity ;
134
- thumb . MouseEnter += thumb_MouseEnter ;
135
- thumb . MouseLeave += thumb_MouseLeave ;
136
- transparentThumbs . Add ( thumb ) ;
137
- break ;
138
- }
139
- }
140
- }
141
-
142
- void ClearTransparencyFromThumbs ( )
143
- {
144
- foreach ( var thumb in transparentThumbs ) {
145
- thumb . MouseEnter -= thumb_MouseEnter ;
146
- thumb . MouseLeave -= thumb_MouseLeave ;
147
- thumb . ClearValue ( Thumb . OpacityProperty ) ;
148
- }
149
- }
150
-
151
- void thumb_MouseEnter ( object sender , MouseEventArgs e )
152
- {
153
- var thumb = ( Thumb ) sender ;
154
- thumb . BeginAnimation ( Thumb . OpacityProperty , new DoubleAnimation ( 1 , animationDuration , FillBehavior . HoldEnd ) ) ;
155
- }
156
-
157
- void thumb_MouseLeave ( object sender , MouseEventArgs e )
158
- {
159
- var thumb = ( Thumb ) sender ;
160
- thumb . BeginAnimation ( Thumb . OpacityProperty , new DoubleAnimation ( thumbOpacity , animationDuration , FillBehavior . HoldEnd ) ) ;
95
+ trackAdorner = new TrackAdorner ( this , grid ) ;
96
+ layer . Add ( trackAdorner ) ;
161
97
}
162
98
#endregion
163
99
@@ -168,62 +104,8 @@ static Brush GetBrush(Color markerColor)
168
104
return brush ;
169
105
}
170
106
171
- #region TrackBackground
172
- sealed class TrackBackground : UIElement
173
- {
174
- readonly TextEditor editor ;
175
- readonly TextMarkerService textMarkerService ;
176
- readonly IChangeWatcher changeWatcher ;
177
-
178
- public TrackBackground ( EnhancedScrollBar enhanchedScrollBar )
179
- {
180
- this . editor = enhanchedScrollBar . editor ;
181
- this . textMarkerService = enhanchedScrollBar . textMarkerService ;
182
- this . changeWatcher = enhanchedScrollBar . changeWatcher ;
183
-
184
- textMarkerService . RedrawRequested += textMarkerService_RedrawRequested ;
185
- }
186
-
187
- public void Remove ( )
188
- {
189
- textMarkerService . RedrawRequested -= textMarkerService_RedrawRequested ;
190
-
191
- Grid grid = ( Grid ) VisualTreeHelper . GetParent ( this ) ;
192
- grid . Children . Remove ( this ) ;
193
- }
194
-
195
- void textMarkerService_RedrawRequested ( object sender , EventArgs e )
196
- {
197
- InvalidateVisual ( ) ;
198
- }
199
-
200
- protected override void OnRender ( DrawingContext drawingContext )
201
- {
202
- var renderSize = this . RenderSize ;
203
- var document = editor . Document ;
204
- var textView = editor . TextArea . TextView ;
205
- double documentHeight = textView . DocumentHeight ;
206
- foreach ( var marker in textMarkerService . TextMarkers ) {
207
- if ( ( marker . MarkerTypes & ( TextMarkerTypes . LineInScrollBar | TextMarkerTypes . CircleInScrollBar ) ) == 0 )
208
- continue ;
209
- var location = document . GetLocation ( marker . StartOffset ) ;
210
- double visualTop = textView . GetVisualTopByDocumentLine ( location . Line ) ;
211
- double renderPos = visualTop / documentHeight * renderSize . Height ;
212
- var brush = GetBrush ( marker . MarkerColor ) ;
213
- if ( ( marker . MarkerTypes & ( TextMarkerTypes . LineInScrollBar ) ) != 0 ) {
214
- drawingContext . DrawRectangle ( brush , null , new Rect ( 3 , renderPos - 1 , renderSize . Width - 6 , 2 ) ) ;
215
- }
216
- if ( ( marker . MarkerTypes & ( TextMarkerTypes . CircleInScrollBar ) ) != 0 ) {
217
- const double radius = 3 ;
218
- drawingContext . DrawEllipse ( brush , null , new Point ( renderSize . Width / 2 , renderPos ) , radius , radius ) ;
219
- }
220
- }
221
- }
222
- }
223
- #endregion
224
-
225
107
#region TrackAdorner
226
- sealed class TrackAdorner : FrameworkElement
108
+ sealed class TrackAdorner : Adorner
227
109
{
228
110
#region TriangleGeometry
229
111
static readonly StreamGeometry triangleGeometry = CreateTriangleGeometry ( ) ;
@@ -247,7 +129,8 @@ static StreamGeometry CreateTriangleGeometry()
247
129
readonly TextEditor editor ;
248
130
readonly TextMarkerService textMarkerService ;
249
131
250
- public TrackAdorner ( EnhancedScrollBar enhanchedScrollBar )
132
+ public TrackAdorner ( EnhancedScrollBar enhanchedScrollBar , Grid trackGrid )
133
+ : base ( trackGrid )
251
134
{
252
135
this . editor = enhanchedScrollBar . editor ;
253
136
this . textMarkerService = enhanchedScrollBar . textMarkerService ;
@@ -261,9 +144,9 @@ public TrackAdorner(EnhancedScrollBar enhanchedScrollBar)
261
144
public void Remove ( )
262
145
{
263
146
textMarkerService . RedrawRequested -= textMarkerService_RedrawRequested ;
264
-
265
- Grid grid = ( Grid ) VisualTreeHelper . GetParent ( this ) ;
266
- grid . Children . Remove ( this ) ;
147
+
148
+ var layer = AdornerLayer . GetAdornerLayer ( AdornedElement ) ;
149
+ layer . Remove ( this ) ;
267
150
}
268
151
269
152
void textMarkerService_RedrawRequested ( object sender , EventArgs e )
@@ -284,28 +167,39 @@ protected override void OnRender(DrawingContext drawingContext)
284
167
double visualTop = textView . GetVisualTopByDocumentLine ( location . Line ) ;
285
168
double renderPos = visualTop / documentHeight * renderSize . Height ;
286
169
var brush = GetBrush ( marker . MarkerColor ) ;
170
+ bool isLineOrCircle = false ;
171
+ if ( ( marker . MarkerTypes & ( TextMarkerTypes . LineInScrollBar ) ) != 0 ) {
172
+ drawingContext . DrawRectangle ( brush , null , new Rect ( 3 , renderPos - 1 , renderSize . Width - 6 , 2 ) ) ;
173
+ isLineOrCircle = true ;
174
+ }
175
+ if ( ( marker . MarkerTypes & ( TextMarkerTypes . CircleInScrollBar ) ) != 0 ) {
176
+ const double radius = 3 ;
177
+ drawingContext . DrawEllipse ( brush , null , new Point ( renderSize . Width / 2 , renderPos ) , radius , radius ) ;
178
+ isLineOrCircle = true ;
179
+ }
180
+ if ( ! isLineOrCircle ) {
181
+ var translateTransform = new TranslateTransform ( 6 , renderPos ) ;
182
+ translateTransform . Freeze ( ) ;
183
+ drawingContext . PushTransform ( translateTransform ) ;
287
184
288
- var translateTransform = new TranslateTransform ( 6 , renderPos ) ;
289
- translateTransform . Freeze ( ) ;
290
- drawingContext . PushTransform ( translateTransform ) ;
291
-
292
- if ( ( marker . MarkerTypes & ( TextMarkerTypes . ScrollBarLeftTriangle ) ) != 0 ) {
293
- var scaleTransform = new ScaleTransform ( - 1 , 1 ) ;
294
- scaleTransform . Freeze ( ) ;
295
- drawingContext . PushTransform ( scaleTransform ) ;
296
- drawingContext . DrawGeometry ( brush , null , triangleGeometry ) ;
185
+ if ( ( marker . MarkerTypes & ( TextMarkerTypes . ScrollBarLeftTriangle ) ) != 0 ) {
186
+ var scaleTransform = new ScaleTransform ( - 1 , 1 ) ;
187
+ scaleTransform . Freeze ( ) ;
188
+ drawingContext . PushTransform ( scaleTransform ) ;
189
+ drawingContext . DrawGeometry ( brush , null , triangleGeometry ) ;
190
+ drawingContext . Pop ( ) ;
191
+ }
192
+ if ( ( marker . MarkerTypes & ( TextMarkerTypes . ScrollBarRightTriangle ) ) != 0 ) {
193
+ drawingContext . DrawGeometry ( brush , null , triangleGeometry ) ;
194
+ }
297
195
drawingContext . Pop ( ) ;
298
196
}
299
- if ( ( marker . MarkerTypes & ( TextMarkerTypes . ScrollBarRightTriangle ) ) != 0 ) {
300
- drawingContext . DrawGeometry ( brush , null , triangleGeometry ) ;
301
- }
302
- drawingContext . Pop ( ) ;
303
197
}
304
198
}
305
199
306
200
bool IsVisibleInAdorner ( ITextMarker marker )
307
201
{
308
- return ( marker . MarkerTypes & ( TextMarkerTypes . ScrollBarLeftTriangle | TextMarkerTypes . ScrollBarRightTriangle ) ) != 0 ;
202
+ return ( marker . MarkerTypes & ( TextMarkerTypes . ScrollBarLeftTriangle | TextMarkerTypes . ScrollBarRightTriangle | TextMarkerTypes . LineInScrollBar | TextMarkerTypes . CircleInScrollBar ) ) != 0 ;
309
203
}
310
204
311
205
protected override void OnMouseDown ( MouseButtonEventArgs e )
0 commit comments