这个问题有点难以描述,让我解释一下我的问题。我有一个定义了高度的数据网格,因此出现了滚动条。我想将垂直滚动条限制在不包括标题的区域内。虽然它只滚动数据行而不是标题,但在视觉上它覆盖了整个数据网格区域右侧。问题在于滚动条区域会出现两个框(一个在上面,一个在下面)。我不知道如何摆脱它们或如何将滚动条限制在数据网格的正文中。
还有一种解决方案可以去掉这两个框的数据网格背景颜色,使它们看起来不那么突出:
类似的解决方案可以在这里找到:Annoying Square Where Scrollbars Meet
然而,它并没有解决滚动条突兀地伸出侧边的问题。
我尝试过的方法是将头部与正文分开,并将正文放入垂直ScrollViewer中,然后将头部和正文放入水平ScrollViewer中,以便它们都可以水平滚动。但是,正如你所想象的那样,这并不起作用,因为您必须向右滚动才能看到垂直滚动条。我相信有一种方法可以使其保持在右侧冻结,但我还没有想出来。另一个问题是头部宽度必须匹配该列中任何单元格的最大可能宽度,否则所有内容都会偏移。当向右滚动到底时,显示的结果如下:
如果我给垂直滚动条一个负边距到左侧(比如-6,0,0,0),并在单元格块的右侧添加类似大小的填充(0,0,6,0),则垂直滚动条技术上应该向左移动。我将继续尝试并努力解决这个问题,除非有人能够为我提供答案(那将是很棒的)。
编辑#1:
好吧,我取得了一些进展,并能够将滚动条的边距设置为(-17,0,0,0)。17似乎是滚动条的宽度。它似乎有一个特定的键来设置其宽度:
但我想不出在XAML中将其作为边距的负偏移值插入的方法。在代码后台中这并不难...但我更愿意保持全部使用XAML。无论如何,这是进展的截图和XAML代码部分:
<Style TargetType="{x:Type DataGrid}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGrid}">
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True">
<ScrollViewer x:Name="DG_ScrollViewer" Focusable="false">
<ScrollViewer.Template>
<ControlTemplate TargetType="{x:Type ScrollViewer}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Button Command="{x:Static DataGrid.SelectAllCommand}" Focusable="false" Style="{DynamicResource {ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}}" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.All}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Width="{Binding CellsPanelHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
<DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter" Grid.Column="1" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
<ScrollContentPresenter Margin="0,0,17,0" x:Name="PART_ScrollContentPresenter" CanContentScroll="{TemplateBinding CanContentScroll}" Grid.ColumnSpan="2" Grid.Row="1"/>
<ScrollBar Margin="-17,0,0,0" x:Name="PART_VerticalScrollBar" Grid.Column="2" Maximum="{TemplateBinding ScrollableHeight}" Orientation="Vertical" Grid.Row="1" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportHeight}"/>
<Grid Grid.Column="1" Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding NonFrozenColumnsViewportHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ScrollBar x:Name="PART_HorizontalScrollBar" Grid.Column="1" Maximum="{TemplateBinding ScrollableWidth}" Orientation="Horizontal" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportWidth}"/>
</Grid>
</Grid>
</ControlTemplate>
</ScrollViewer.Template>
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</ScrollViewer>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
重要的部分是代码片段中间设置ScrollBar的Margin属性为"-17,0,0,0",这使得变化成为可能。
我目前的问题是我无法确定哪个组件需要向左偏移17个单位(通过添加margin或padding)。我已经尝试了所有的组件,但还没有成功。如果有人在我之前找到了解决办法,我会尽快更新。现在,滚动条将覆盖最后一列中的任何内容,直到我修复偏移量。
编辑#2:
请参考上面更新的XAML代码。我所做的是将Margin属性添加到ScrollContentPresenter中,值为"0,0,17,0"。
一个副作用,我完全可以接受,就是它也会抵消掉标题,但你只有在向右滚动到底部时才能看到。它只影响最后一列的标题,因为ScrollContentPresenter也会偏移它…奇怪的是,有一个DataGridColumnHeadersPresenter,但它是独立工作的…所以,我会继续努力解决这个问题。不幸的是,ScrollContentPresenter没有填充,这将像魔法一样发挥作用。所以,现在我必须弄清楚如何填充它,而不是设置边距,或者找出一个不同的方法。
类似的方法是将水平滚动条(第二个网格中的滚动条)的边距设置为0,0,-17,0。它会将其移动17个单位,然后将DataGridColumnHeaderPresenter的边距设置为0,0,-17,0。它会将其移动17个单位向右。
EDIT #3:
这里还有另一种方法,供感兴趣的人参考:
编辑#4:
我找到了解决方案。请查看我的答案中的XAML代码、屏幕截图和说明。