Skip to content

Commit 4582759

Browse files
committed
Sync the headers on the list view so they line up when the list view is scrolled horiontally.
1 parent 092f551 commit 4582759

File tree

3 files changed

+38
-3
lines changed

3 files changed

+38
-3
lines changed

MaterialDesignThemes.Wpf/MaterialDesignThemes.Wpf.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@
324324
<Compile Include="Palette.cs" />
325325
<Compile Include="Plane3D.cs" />
326326
<Compile Include="ScaleHost.cs" />
327+
<Compile Include="ScrollViewerAssist.cs" />
327328
<Compile Include="Snackbar.cs" />
328329
<Compile Include="SnackbarMessage.cs" />
329330
<Compile Include="SnackbarMessageEventArgs.cs" />
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System;
2+
using System.Windows;
3+
using System.Windows.Controls;
4+
5+
namespace MaterialDesignThemes.Wpf
6+
{
7+
internal static class ScrollViewerAssist
8+
{
9+
public static readonly DependencyProperty HorizontalOffsetProperty = DependencyProperty.RegisterAttached(
10+
"SyncHorizontalOffset", typeof(double), typeof(ScrollViewerAssist), new PropertyMetadata(default(double), OnSyncHorizontalOffsetChanged));
11+
12+
private static void OnSyncHorizontalOffsetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
13+
{
14+
var scrollViewer = d as ScrollViewer;
15+
scrollViewer?.ScrollToHorizontalOffset((double)e.NewValue);
16+
}
17+
18+
public static void SetSyncHorizontalOffset(DependencyObject element, double value)
19+
{
20+
element.SetValue(HorizontalOffsetProperty, value);
21+
}
22+
23+
public static double GetSyncHorizontalOffset(DependencyObject element)
24+
{
25+
return (double) element.GetValue(HorizontalOffsetProperty);
26+
}
27+
}
28+
}

MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.ListView.xaml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@
2727
<ScrollViewer DockPanel.Dock="Top"
2828
Focusable="false"
2929
HorizontalScrollBarVisibility="Hidden"
30-
VerticalScrollBarVisibility="Hidden">
30+
VerticalScrollBarVisibility="Hidden"
31+
wpf:ScrollViewerAssist.SyncHorizontalOffset="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}">
3132
<Border BorderBrush="{DynamicResource MaterialDesignDivider}" BorderThickness="0,0,0,1">
32-
<GridViewHeaderRowPresenter x:Name="PART_GridViewHeaderRowPresenter"
33+
<StackPanel Orientation="Horizontal">
34+
<GridViewHeaderRowPresenter x:Name="PART_GridViewHeaderRowPresenter"
3335
AllowsColumnReorder="{Binding Path=TemplatedParent.View.AllowsColumnReorder, RelativeSource={RelativeSource TemplatedParent}}"
3436
ColumnHeaderContainerStyle="{Binding Path=TemplatedParent.View.ColumnHeaderContainerStyle, RelativeSource={RelativeSource TemplatedParent}}"
3537
ColumnHeaderContextMenu="{Binding Path=TemplatedParent.View.ColumnHeaderContextMenu, RelativeSource={RelativeSource TemplatedParent}}"
@@ -38,7 +40,11 @@
3840
ColumnHeaderToolTip="{Binding Path=TemplatedParent.View.ColumnHeaderToolTip, RelativeSource={RelativeSource TemplatedParent}}"
3941
Columns="{Binding Path=TemplatedParent.View.Columns, RelativeSource={RelativeSource TemplatedParent}}"
4042
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
43+
<!-- NB: Rectangle added to keep the width of the header ScrollViewer the same size as the list items -->
44+
<Rectangle Margin="{Binding RelativeSource={RelativeSource Self}, Path=(wpf:ListViewAssist.ListViewItemPadding)}" />
45+
</StackPanel>
4146
</Border>
47+
4248
</ScrollViewer>
4349

4450
<ScrollContentPresenter Name="PART_ScrollContentPresenter"
@@ -221,7 +227,7 @@
221227
<Setter Property="BorderBrush" Value="{DynamicResource MaterialDesignTextBoxBorder}" />
222228
<Setter Property="BorderThickness" Value="0" />
223229
<Setter Property="FontSize" Value="13" />
224-
<Setter Property="ItemContainerStyle" Value="{Binding RelativeSource={RelativeSource Self}, Path=View, Converter={StaticResource MaterialDesignListViewItemContainerStyleConverter}}" />
230+
<Setter Property="ItemContainerStyle" Value="{Binding RelativeSource={RelativeSource Self}, Path=View, Converter={StaticResource MaterialDesignListViewItemContainerStyleConverter}}" />
225231
<Setter Property="ScrollViewer.CanContentScroll" Value="True" />
226232
<Setter Property="ScrollViewer.PanningMode" Value="Both" />
227233
<Setter Property="Stylus.IsFlicksEnabled" Value="False" />

0 commit comments

Comments
 (0)