我会通过重写ScrollViewer的样式来实现这个功能。这样做的好处是它可以自动处理标题的调整大小。
XAML:
<Grid>
<Grid.Resources>
<local:HeightToMarginConverter x:Key="HeightToMarginConverter"/>
<Style x:Key="" TargetType="">
<Setter Property="Focusable" Value="false"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="">
<Grid Background="" SnapsToDevicePixels="true">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- Here I set Grid.ColumnSpan to 2, so it stretches over the scrollbar -->
<DockPanel Margin="" Grid.ColumnSpan="2">
<ScrollViewer DockPanel.Dock="Top" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden">
<GridViewHeaderRowPresenter x:Name="gridViewHeaderRowPresenter" AllowsColumnReorder="}" ColumnHeaderContainerStyle="}" ColumnHeaderToolTip="}" ColumnHeaderStringFormat="}" ColumnHeaderContextMenu="}" ColumnHeaderTemplate="}" Columns="}" ColumnHeaderTemplateSelector="}" Margin="2,0,2,0" SnapsToDevicePixels=""/>
</ScrollViewer>
<ScrollContentPresenter x:Name="PART_ScrollContentPresenter" CanContentScroll="" ContentTemplate="" Content="" KeyboardNavigation.DirectionalNavigation="Local" SnapsToDevicePixels=""/>
</DockPanel>
<ScrollBar x:Name="PART_HorizontalScrollBar" Cursor="Arrow" Maximum="" Minimum="0.0" Orientation="Horizontal" Grid.Row="1" Visibility="" Value="}" ViewportSize=""/>
<!-- Here I set the vertical scrollbar's top margin by binding it to the GridViewHeaderRowPresenter's ActualHeight property and using a converter -->
<ScrollBar x:Name="PART_VerticalScrollBar" Cursor="Arrow" Grid.Column="1" Maximum="" Minimum="0.0" Orientation="Vertical" Visibility="" Value="}" ViewportSize="" Margin="}"/>
<DockPanel Background="" Grid.Column="1" LastChildFill="false" Grid.Row="1">
<Rectangle DockPanel.Dock="Left" Fill="White" Visibility="" Width="1"/>
<Rectangle DockPanel.Dock="Top" Fill="White" Height="1" Visibility=""/>
</DockPanel>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>
<ListView>
<!-- Normal stuff here -->
</ListView>
</Grid>
HeightToMarginConverter.cs:
class HeightToMarginConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value == null ? new Thickness() : new Thickness(0, (double)value, 0, 0);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}