Skip to content

Commit 5ee1c9d

Browse files
corvinszKeboo
andauthored
Forward ScrollViewerAssist.BubbleVerticalScroll to nested ScrollViewers (#4057)
* docs: add reproduction to demo app * fix: forward ScrollViewerAssist.BubbleVerticalScroll to nested ScrollViewers * fix: properly unregister ScrollViewerAssist event handlers Ensure `MouseWheel` and `Unloaded` event handlers are detached when `ScrollViewerAssist` functionality is removed from a `ScrollViewer`. This prevents potential memory leaks or incorrect behavior. Resolves #4055 * Revert "docs: add reproduction to demo app" This reverts commit 2aa7e08. --------- Co-authored-by: Kevin Bost <kitokeboo@gmail.com>
1 parent f8b373b commit 5ee1c9d

6 files changed

Lines changed: 17 additions & 9 deletions

src/MaterialDesignThemes.Wpf/ScrollViewerAssist.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public static PaddingMode GetPaddingMode(DependencyObject element)
5656
=> (PaddingMode)element.GetValue(PaddingModeProperty);
5757

5858
public static readonly DependencyProperty IgnorePaddingProperty = DependencyProperty.RegisterAttached(
59-
"IgnorePadding", typeof(bool), typeof(ScrollViewerAssist), new PropertyMetadata(true));
59+
"IgnorePadding", typeof(bool), typeof(ScrollViewerAssist), new PropertyMetadata(true));
6060

6161
public static void SetIgnorePadding(DependencyObject element, bool value) => element.SetValue(IgnorePaddingProperty, value);
6262
public static bool GetIgnorePadding(DependencyObject element) => (bool)element.GetValue(IgnorePaddingProperty);
@@ -191,7 +191,7 @@ private static void OnBubbleVerticalScrollChanged(DependencyObject d, Dependency
191191
{
192192
if (sv.IsLoaded)
193193
{
194-
DoOnLoaded(sv);
194+
ApplyBubbleVerticalScrollHooks(sv);
195195
}
196196
else
197197
{
@@ -204,7 +204,7 @@ static void OnLoaded(object? sender, RoutedEventArgs e)
204204
{
205205
if (sender is ScrollViewer sv)
206206
{
207-
DoOnLoaded(sv);
207+
ApplyBubbleVerticalScrollHooks(sv);
208208
}
209209
}
210210

@@ -244,7 +244,7 @@ static void RegisterForMouseWheelEvent(ScrollViewer sv)
244244
sv.AddHandler(UIElement.MouseWheelEvent, (RoutedEventHandler)ScrollViewerOnMouseWheel, true);
245245
}
246246

247-
static void DoOnLoaded(ScrollViewer sv)
247+
static void ApplyBubbleVerticalScrollHooks(ScrollViewer sv)
248248
{
249249
if (GetBubbleVerticalScroll(sv))
250250
{
@@ -255,6 +255,8 @@ static void DoOnLoaded(ScrollViewer sv)
255255
else
256256
{
257257
RemoveHook(sv);
258+
UnregisterForMouseWheelEvent(sv);
259+
UnregisterForUnloadedEvent(sv);
258260
}
259261
}
260262

src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.DataGrid.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@
489489
BorderThickness="{TemplateBinding BorderThickness}"
490490
CornerRadius="{TemplateBinding wpf:DataGridAssist.CornerRadius}"
491491
SnapsToDevicePixels="True">
492-
<ScrollViewer x:Name="DG_ScrollViewer" Focusable="false">
492+
<ScrollViewer x:Name="DG_ScrollViewer" Focusable="false" wpf:ScrollViewerAssist.BubbleVerticalScroll="{Binding Path=(wpf:ScrollViewerAssist.BubbleVerticalScroll), RelativeSource={RelativeSource TemplatedParent}}">
493493
<ScrollViewer.Template>
494494
<ControlTemplate TargetType="{x:Type ScrollViewer}">
495495
<Grid>

src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.ListBox.xaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,7 @@
358358
<ScrollViewer Padding="{TemplateBinding Padding}"
359359
wpf:ScrollViewerAssist.IgnorePadding="{Binding Path=(wpf:ScrollViewerAssist.IgnorePadding), RelativeSource={RelativeSource TemplatedParent}}"
360360
wpf:ScrollViewerAssist.PaddingMode="{Binding Path=(wpf:ScrollViewerAssist.PaddingMode), RelativeSource={RelativeSource TemplatedParent}}"
361+
wpf:ScrollViewerAssist.BubbleVerticalScroll="{Binding Path=(wpf:ScrollViewerAssist.BubbleVerticalScroll), RelativeSource={RelativeSource TemplatedParent}}"
361362
ClipToBounds="False"
362363
Focusable="false">
363364
<ItemsPresenter ClipToBounds="False" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
@@ -641,7 +642,8 @@
641642
<ScrollViewer Padding="{TemplateBinding Padding}"
642643
Focusable="false"
643644
wpf:ScrollViewerAssist.IgnorePadding="{Binding Path=(wpf:ScrollViewerAssist.IgnorePadding), RelativeSource={RelativeSource TemplatedParent}}"
644-
wpf:ScrollViewerAssist.PaddingMode="{Binding Path=(wpf:ScrollViewerAssist.PaddingMode), RelativeSource={RelativeSource TemplatedParent}}">
645+
wpf:ScrollViewerAssist.PaddingMode="{Binding Path=(wpf:ScrollViewerAssist.PaddingMode), RelativeSource={RelativeSource TemplatedParent}}"
646+
wpf:ScrollViewerAssist.BubbleVerticalScroll="{Binding Path=(wpf:ScrollViewerAssist.BubbleVerticalScroll), RelativeSource={RelativeSource TemplatedParent}}">
645647
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
646648
</ScrollViewer>
647649
</Border>

src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.ListView.xaml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
wpf:ScrollViewerAssist.SyncHorizontalOffset="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
3535
wpf:ScrollViewerAssist.IgnorePadding="{Binding Path=(wpf:ScrollViewerAssist.IgnorePadding), RelativeSource={RelativeSource TemplatedParent}}"
3636
wpf:ScrollViewerAssist.PaddingMode="{Binding Path=(wpf:ScrollViewerAssist.PaddingMode), RelativeSource={RelativeSource TemplatedParent}}"
37+
wpf:ScrollViewerAssist.BubbleVerticalScroll="{Binding Path=(wpf:ScrollViewerAssist.BubbleVerticalScroll), RelativeSource={RelativeSource TemplatedParent}}"
3738
DockPanel.Dock="Top"
3839
Focusable="false"
3940
HorizontalScrollBarVisibility="Hidden"
@@ -212,9 +213,9 @@
212213
<converters:ListViewGridViewConverter x:Key="MaterialDesignListViewTemplateConverter">
213214
<converters:ListViewGridViewConverter.DefaultValue>
214215
<ControlTemplate TargetType="{x:Type ListView}">
215-
<ScrollViewer>
216+
<ScrollViewer wpf:ScrollViewerAssist.BubbleVerticalScroll="{Binding Path=(wpf:ScrollViewerAssist.BubbleVerticalScroll), RelativeSource={RelativeSource TemplatedParent}}">
216217
<ItemsPresenter />
217-
</ScrollViewer>
218+
</ScrollViewer>
218219
<ControlTemplate.Triggers>
219220
<Trigger Property="IsGrouping" Value="True">
220221
<Setter Property="ScrollViewer.CanContentScroll" Value="false" />
@@ -224,7 +225,8 @@
224225
</converters:ListViewGridViewConverter.DefaultValue>
225226
<converters:ListViewGridViewConverter.ViewValue>
226227
<ControlTemplate TargetType="{x:Type ListView}">
227-
<ScrollViewer Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}">
228+
<ScrollViewer Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}"
229+
wpf:ScrollViewerAssist.BubbleVerticalScroll="{Binding Path=(wpf:ScrollViewerAssist.BubbleVerticalScroll), RelativeSource={RelativeSource TemplatedParent}}">
228230
<ItemsPresenter />
229231
</ScrollViewer>
230232
<ControlTemplate.Triggers>

src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TreeListView.xaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,7 @@
284284
Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}"
285285
wpf:ScrollViewerAssist.IgnorePadding="{Binding Path=(wpf:ScrollViewerAssist.IgnorePadding), RelativeSource={RelativeSource TemplatedParent}}"
286286
wpf:ScrollViewerAssist.PaddingMode="{Binding Path=(wpf:ScrollViewerAssist.PaddingMode), RelativeSource={RelativeSource TemplatedParent}}"
287+
wpf:ScrollViewerAssist.BubbleVerticalScroll="{Binding Path=(wpf:ScrollViewerAssist.BubbleVerticalScroll), RelativeSource={RelativeSource TemplatedParent}}"
287288
Padding="{TemplateBinding Padding}"
288289
Background="{TemplateBinding Background}"
289290
CanContentScroll="false"

src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TreeView.xaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
Background="{TemplateBinding Background}"
2424
wpf:ScrollViewerAssist.IgnorePadding="{Binding Path=(wpf:ScrollViewerAssist.IgnorePadding), RelativeSource={RelativeSource TemplatedParent}}"
2525
wpf:ScrollViewerAssist.PaddingMode="{Binding Path=(wpf:ScrollViewerAssist.PaddingMode), RelativeSource={RelativeSource TemplatedParent}}"
26+
wpf:ScrollViewerAssist.BubbleVerticalScroll="{Binding Path=(wpf:ScrollViewerAssist.BubbleVerticalScroll), RelativeSource={RelativeSource TemplatedParent}}"
2627
CanContentScroll="false"
2728
Focusable="false"
2829
HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"

0 commit comments

Comments
 (0)