@@ -71,6 +71,9 @@ public static bool GetShowSeparators(DependencyObject element)
71
71
private static readonly DependencyProperty HorizontalScrollHookProperty = DependencyProperty . RegisterAttached (
72
72
"HorizontalScrollHook" , typeof ( HwndSourceHook ) , typeof ( ScrollViewerAssist ) , new PropertyMetadata ( null ) ) ;
73
73
74
+ private static readonly DependencyProperty HorizontalScrollSourceProperty = DependencyProperty . RegisterAttached (
75
+ "HorizontalScrollSource" , typeof ( HwndSource ) , typeof ( ScrollViewerAssist ) , new PropertyMetadata ( null ) ) ;
76
+
74
77
public static readonly DependencyProperty SupportHorizontalScrollProperty = DependencyProperty . RegisterAttached (
75
78
"SupportHorizontalScroll" , typeof ( bool ) , typeof ( ScrollViewerAssist ) , new PropertyMetadata ( false , OnSupportHorizontalScrollChanged ) ) ;
76
79
@@ -79,50 +82,49 @@ private static void OnSupportHorizontalScrollChanged(DependencyObject d, Depende
79
82
//Based on: https://blog.walterlv.com/post/handle-horizontal-scrolling-of-touchpad-en.html
80
83
if ( d is ScrollViewer scrollViewer )
81
84
{
82
- if ( ( bool ) e . NewValue )
85
+ if ( scrollViewer . IsLoaded )
83
86
{
84
- OnLoaded ( scrollViewer , sv =>
85
- {
86
- if ( GetSupportHorizontalScroll ( sv ) )
87
- {
88
- RegisterHook ( sv ) ;
89
- }
90
- } ) ;
87
+ DoOnLoaded ( scrollViewer ) ;
91
88
}
92
89
else
93
90
{
94
- OnLoaded ( scrollViewer , sv =>
95
- {
96
- if ( ! GetSupportHorizontalScroll ( sv ) )
97
- {
98
- RemoveHook ( sv ) ;
99
- }
100
- } ) ;
91
+ WeakEventManager < ScrollViewer , RoutedEventArgs > . AddHandler ( scrollViewer , nameof ( ScrollViewer . Loaded ) , OnLoaded ) ;
92
+ WeakEventManager < ScrollViewer , RoutedEventArgs > . AddHandler ( scrollViewer , nameof ( ScrollViewer . Unloaded ) , OnUnloaded ) ;
101
93
}
102
94
}
103
95
104
- static void OnLoaded ( ScrollViewer scrollViewer , Action < ScrollViewer > doOnLoaded )
96
+ static void OnLoaded ( object ? sender , RoutedEventArgs e )
105
97
{
106
- if ( scrollViewer . IsLoaded )
98
+ if ( sender is ScrollViewer sv )
99
+ {
100
+ DoOnLoaded ( sv ) ;
101
+ }
102
+ }
103
+
104
+ static void DoOnLoaded ( ScrollViewer sv )
105
+ {
106
+ if ( GetSupportHorizontalScroll ( sv ) )
107
107
{
108
- doOnLoaded ( scrollViewer ) ;
108
+ RegisterHook ( sv ) ;
109
109
}
110
110
else
111
111
{
112
- RoutedEventHandler ? onLoaded = null ;
113
- onLoaded = ( _ , _ ) =>
114
- {
115
- scrollViewer . Loaded -= onLoaded ;
116
- doOnLoaded ( scrollViewer ) ;
117
- } ;
118
- scrollViewer . Loaded += onLoaded ;
112
+ RemoveHook ( sv ) ;
113
+ }
114
+ }
115
+
116
+ static void OnUnloaded ( object ? sender , RoutedEventArgs e )
117
+ {
118
+ if ( sender is ScrollViewer sv )
119
+ {
120
+ RemoveHook ( sv ) ;
119
121
}
120
122
}
121
123
122
124
static void RemoveHook ( ScrollViewer scrollViewer )
123
125
{
124
126
if ( scrollViewer . GetValue ( HorizontalScrollHookProperty ) is HwndSourceHook hook &&
125
- PresentationSource . FromVisual ( scrollViewer ) is HwndSource source )
127
+ scrollViewer . GetValue ( HorizontalScrollSourceProperty ) is HwndSource source )
126
128
{
127
129
source . RemoveHook ( hook ) ;
128
130
scrollViewer . SetValue ( HorizontalScrollHookProperty , null ) ;
@@ -135,6 +137,7 @@ static void RegisterHook(ScrollViewer scrollViewer)
135
137
if ( PresentationSource . FromVisual ( scrollViewer ) is HwndSource source )
136
138
{
137
139
HwndSourceHook hook = Hook ;
140
+ scrollViewer . SetValue ( HorizontalScrollSourceProperty , source ) ;
138
141
scrollViewer . SetValue ( HorizontalScrollHookProperty , hook ) ;
139
142
source . AddHook ( hook ) ;
140
143
}
@@ -166,43 +169,42 @@ private static void OnBubbleVerticalScrollChanged(DependencyObject d, Dependency
166
169
{
167
170
if ( d is ScrollViewer scrollViewer )
168
171
{
169
- if ( ( bool ) e . NewValue )
172
+ if ( scrollViewer . IsLoaded )
170
173
{
171
- OnLoaded ( scrollViewer , sv =>
172
- {
173
- if ( GetBubbleVerticalScroll ( sv ) )
174
- {
175
- RegisterHook ( sv ) ;
176
- }
177
- } ) ;
174
+ DoOnLoaded ( scrollViewer ) ;
178
175
}
179
176
else
180
177
{
181
- OnLoaded ( scrollViewer , sv =>
182
- {
183
- if ( ! GetBubbleVerticalScroll ( sv ) )
184
- {
185
- RemoveHook ( sv ) ;
186
- }
187
- } ) ;
178
+ WeakEventManager < ScrollViewer , RoutedEventArgs > . AddHandler ( scrollViewer , nameof ( ScrollViewer . Loaded ) , OnLoaded ) ;
179
+ WeakEventManager < ScrollViewer , RoutedEventArgs > . AddHandler ( scrollViewer , nameof ( ScrollViewer . Unloaded ) , OnUnloaded ) ;
188
180
}
189
181
}
190
182
191
- static void OnLoaded ( ScrollViewer scrollViewer , Action < ScrollViewer > doOnLoaded )
183
+ static void OnLoaded ( object ? sender , RoutedEventArgs e )
192
184
{
193
- if ( scrollViewer . IsLoaded )
185
+ if ( sender is ScrollViewer sv )
194
186
{
195
- doOnLoaded ( scrollViewer ) ;
187
+ DoOnLoaded ( sv ) ;
188
+ }
189
+ }
190
+
191
+ static void DoOnLoaded ( ScrollViewer sv )
192
+ {
193
+ if ( GetBubbleVerticalScroll ( sv ) )
194
+ {
195
+ RegisterHook ( sv ) ;
196
196
}
197
197
else
198
198
{
199
- RoutedEventHandler ? onLoaded = null ;
200
- onLoaded = ( _ , _ ) =>
201
- {
202
- scrollViewer . Loaded -= onLoaded ;
203
- doOnLoaded ( scrollViewer ) ;
204
- } ;
205
- scrollViewer . Loaded += onLoaded ;
199
+ RemoveHook ( sv ) ;
200
+ }
201
+ }
202
+
203
+ static void OnUnloaded ( object ? sender , RoutedEventArgs e )
204
+ {
205
+ if ( sender is ScrollViewer sv )
206
+ {
207
+ RemoveHook ( sv ) ;
206
208
}
207
209
}
208
210
0 commit comments