From ecbbf84ba51a7461ea227bd6d9957e8f8dfa719a Mon Sep 17 00:00:00 2001
From: Corvin <43533385+corvinsz@users.noreply.github.com>
Date: Thu, 28 May 2026 15:38:27 +0200
Subject: [PATCH 1/4] docs: add reproduction to demo app
---
src/MainDemo.Wpf/Home.xaml | 51 +++++++++++++++++++++++++++++++++++
src/MainDemo.Wpf/Home.xaml.cs | 9 ++++++-
2 files changed, 59 insertions(+), 1 deletion(-)
diff --git a/src/MainDemo.Wpf/Home.xaml b/src/MainDemo.Wpf/Home.xaml
index 983f7ba0e6..4916b3e4b4 100644
--- a/src/MainDemo.Wpf/Home.xaml
+++ b/src/MainDemo.Wpf/Home.xaml
@@ -54,6 +54,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/MainDemo.Wpf/Home.xaml.cs b/src/MainDemo.Wpf/Home.xaml.cs
index cd599e13fa..b5a10ffc6e 100644
--- a/src/MainDemo.Wpf/Home.xaml.cs
+++ b/src/MainDemo.Wpf/Home.xaml.cs
@@ -5,7 +5,14 @@ namespace MaterialDesignDemo;
public partial class Home
{
- public Home() => InitializeComponent();
+ public Home()
+ {
+ InitializeComponent();
+ Numbers = Enumerable.Range(0, 100).ToList();
+ DataContext = this;
+ }
+
+ public IReadOnlyList Numbers { get; }
private void GitHubButton_OnClick(object sender, RoutedEventArgs e)
=> Link.OpenInBrowser(ConfigurationManager.AppSettings["GitHub"]);
From fad19d5dd398227338888a63329ed3af8c7b753f Mon Sep 17 00:00:00 2001
From: Corvin <43533385+corvinsz@users.noreply.github.com>
Date: Thu, 28 May 2026 15:39:55 +0200
Subject: [PATCH 2/4] fix: forward ScrollViewerAssist.BubbleVerticalScroll to
nested ScrollViewers
---
.../Themes/MaterialDesignTheme.DataGrid.xaml | 2 +-
.../Themes/MaterialDesignTheme.ListBox.xaml | 4 +++-
.../Themes/MaterialDesignTheme.ListView.xaml | 8 +++++---
.../Themes/MaterialDesignTheme.TreeListView.xaml | 1 +
.../Themes/MaterialDesignTheme.TreeView.xaml | 1 +
5 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.DataGrid.xaml b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.DataGrid.xaml
index 0b2d8a19fb..fb0e3a3216 100644
--- a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.DataGrid.xaml
+++ b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.DataGrid.xaml
@@ -489,7 +489,7 @@
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="{TemplateBinding wpf:DataGridAssist.CornerRadius}"
SnapsToDevicePixels="True">
-
+
diff --git a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.ListBox.xaml b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.ListBox.xaml
index 014d0783bd..89ec715a60 100644
--- a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.ListBox.xaml
+++ b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.ListBox.xaml
@@ -358,6 +358,7 @@
@@ -641,7 +642,8 @@
+ wpf:ScrollViewerAssist.PaddingMode="{Binding Path=(wpf:ScrollViewerAssist.PaddingMode), RelativeSource={RelativeSource TemplatedParent}}"
+ wpf:ScrollViewerAssist.BubbleVerticalScroll="{Binding Path=(wpf:ScrollViewerAssist.BubbleVerticalScroll), RelativeSource={RelativeSource TemplatedParent}}">
diff --git a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.ListView.xaml b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.ListView.xaml
index 77dce2c859..8cf4224d41 100644
--- a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.ListView.xaml
+++ b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.ListView.xaml
@@ -34,6 +34,7 @@
wpf:ScrollViewerAssist.SyncHorizontalOffset="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
wpf:ScrollViewerAssist.IgnorePadding="{Binding Path=(wpf:ScrollViewerAssist.IgnorePadding), RelativeSource={RelativeSource TemplatedParent}}"
wpf:ScrollViewerAssist.PaddingMode="{Binding Path=(wpf:ScrollViewerAssist.PaddingMode), RelativeSource={RelativeSource TemplatedParent}}"
+ wpf:ScrollViewerAssist.BubbleVerticalScroll="{Binding Path=(wpf:ScrollViewerAssist.BubbleVerticalScroll), RelativeSource={RelativeSource TemplatedParent}}"
DockPanel.Dock="Top"
Focusable="false"
HorizontalScrollBarVisibility="Hidden"
@@ -212,9 +213,9 @@
-
+
-
+
@@ -224,7 +225,8 @@
-
+
diff --git a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TreeListView.xaml b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TreeListView.xaml
index 6b0875216f..0650611f9d 100644
--- a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TreeListView.xaml
+++ b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TreeListView.xaml
@@ -284,6 +284,7 @@
Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}"
wpf:ScrollViewerAssist.IgnorePadding="{Binding Path=(wpf:ScrollViewerAssist.IgnorePadding), RelativeSource={RelativeSource TemplatedParent}}"
wpf:ScrollViewerAssist.PaddingMode="{Binding Path=(wpf:ScrollViewerAssist.PaddingMode), RelativeSource={RelativeSource TemplatedParent}}"
+ wpf:ScrollViewerAssist.BubbleVerticalScroll="{Binding Path=(wpf:ScrollViewerAssist.BubbleVerticalScroll), RelativeSource={RelativeSource TemplatedParent}}"
Padding="{TemplateBinding Padding}"
Background="{TemplateBinding Background}"
CanContentScroll="false"
diff --git a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TreeView.xaml b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TreeView.xaml
index 9b5cb01956..c66fd96ed9 100644
--- a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TreeView.xaml
+++ b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TreeView.xaml
@@ -23,6 +23,7 @@
Background="{TemplateBinding Background}"
wpf:ScrollViewerAssist.IgnorePadding="{Binding Path=(wpf:ScrollViewerAssist.IgnorePadding), RelativeSource={RelativeSource TemplatedParent}}"
wpf:ScrollViewerAssist.PaddingMode="{Binding Path=(wpf:ScrollViewerAssist.PaddingMode), RelativeSource={RelativeSource TemplatedParent}}"
+ wpf:ScrollViewerAssist.BubbleVerticalScroll="{Binding Path=(wpf:ScrollViewerAssist.BubbleVerticalScroll), RelativeSource={RelativeSource TemplatedParent}}"
CanContentScroll="false"
Focusable="false"
HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
From 59e78a6e7390e5537dd77a60e566f971c3b27989 Mon Sep 17 00:00:00 2001
From: Kevin Bost
Date: Thu, 28 May 2026 21:41:58 -0700
Subject: [PATCH 3/4] 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
---
src/MaterialDesignThemes.Wpf/ScrollViewerAssist.cs | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/src/MaterialDesignThemes.Wpf/ScrollViewerAssist.cs b/src/MaterialDesignThemes.Wpf/ScrollViewerAssist.cs
index 11f3658d4e..b2a78197eb 100644
--- a/src/MaterialDesignThemes.Wpf/ScrollViewerAssist.cs
+++ b/src/MaterialDesignThemes.Wpf/ScrollViewerAssist.cs
@@ -56,7 +56,7 @@ public static PaddingMode GetPaddingMode(DependencyObject element)
=> (PaddingMode)element.GetValue(PaddingModeProperty);
public static readonly DependencyProperty IgnorePaddingProperty = DependencyProperty.RegisterAttached(
- "IgnorePadding", typeof(bool), typeof(ScrollViewerAssist), new PropertyMetadata(true));
+ "IgnorePadding", typeof(bool), typeof(ScrollViewerAssist), new PropertyMetadata(true));
public static void SetIgnorePadding(DependencyObject element, bool value) => element.SetValue(IgnorePaddingProperty, value);
public static bool GetIgnorePadding(DependencyObject element) => (bool)element.GetValue(IgnorePaddingProperty);
@@ -191,7 +191,7 @@ private static void OnBubbleVerticalScrollChanged(DependencyObject d, Dependency
{
if (sv.IsLoaded)
{
- DoOnLoaded(sv);
+ ApplyBubbleVerticalScrollHooks(sv);
}
else
{
@@ -204,7 +204,7 @@ static void OnLoaded(object? sender, RoutedEventArgs e)
{
if (sender is ScrollViewer sv)
{
- DoOnLoaded(sv);
+ ApplyBubbleVerticalScrollHooks(sv);
}
}
@@ -244,7 +244,7 @@ static void RegisterForMouseWheelEvent(ScrollViewer sv)
sv.AddHandler(UIElement.MouseWheelEvent, (RoutedEventHandler)ScrollViewerOnMouseWheel, true);
}
- static void DoOnLoaded(ScrollViewer sv)
+ static void ApplyBubbleVerticalScrollHooks(ScrollViewer sv)
{
if (GetBubbleVerticalScroll(sv))
{
@@ -255,6 +255,8 @@ static void DoOnLoaded(ScrollViewer sv)
else
{
RemoveHook(sv);
+ UnregisterForMouseWheelEvent(sv);
+ UnregisterForUnloadedEvent(sv);
}
}
From bec49fee746b14327d50918e3b1d304a6e54451b Mon Sep 17 00:00:00 2001
From: Kevin Bost
Date: Thu, 28 May 2026 21:42:07 -0700
Subject: [PATCH 4/4] Revert "docs: add reproduction to demo app"
This reverts commit 2aa7e081a0cd20ed2bf3e85165a643391d4c324c.
---
src/MainDemo.Wpf/Home.xaml | 51 -----------------------------------
src/MainDemo.Wpf/Home.xaml.cs | 9 +------
2 files changed, 1 insertion(+), 59 deletions(-)
diff --git a/src/MainDemo.Wpf/Home.xaml b/src/MainDemo.Wpf/Home.xaml
index 4916b3e4b4..983f7ba0e6 100644
--- a/src/MainDemo.Wpf/Home.xaml
+++ b/src/MainDemo.Wpf/Home.xaml
@@ -54,57 +54,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/MainDemo.Wpf/Home.xaml.cs b/src/MainDemo.Wpf/Home.xaml.cs
index b5a10ffc6e..cd599e13fa 100644
--- a/src/MainDemo.Wpf/Home.xaml.cs
+++ b/src/MainDemo.Wpf/Home.xaml.cs
@@ -5,14 +5,7 @@ namespace MaterialDesignDemo;
public partial class Home
{
- public Home()
- {
- InitializeComponent();
- Numbers = Enumerable.Range(0, 100).ToList();
- DataContext = this;
- }
-
- public IReadOnlyList Numbers { get; }
+ public Home() => InitializeComponent();
private void GitHubButton_OnClick(object sender, RoutedEventArgs e)
=> Link.OpenInBrowser(ConfigurationManager.AppSettings["GitHub"]);