如何在WPF中修改DataGrid垂直滚动条的位置?

已解决: 请使用XAML代码,屏幕截图和说明查看下面我自己的答案。

标题这一点有点难,所以让我解释一下我的问题。 我有一个具有已定义高度的数据网格,因此会出现滚动条。 我想将垂直滚动条包含到排除标题的区域。 虽然它只滚动数据行而不是标题,但在视觉上它覆盖了右边的整个数据网格区域。 问题在于滚动条区域出现两个框(一个在上方和下方)。 我不知道如何摆脱它们或如何将滚动条包含到datagrid的主体。

在此处输入图像描述

我唯一能够弄清楚的(我不喜欢它的外观)是将DataGrid的背景设置为透明。 结果如下:

在此处输入图像描述

如你所见,滚动条令人讨厌。 然后,如果背景是透明的,那么水平滚动条和最后一行之间也存在间隙的问题:

在此处输入图像描述

还有一个解决方案可以摆脱这两个盒子的数据网格的背景颜色,使它们更加突出:

http://social.msdn.microsoft.com/Forums/vstudio/en-US/9fc4252b-38b1-4369-8d76-b6c5ae1e4df5/how-to-remove-the-blank-space-above-the-verticalscroolbar-of-数据网格式,WPF?论坛= WPF

类似的解决方案可以在这里找到: 恼人的广场滚动条相遇

但是,它并没有摆脱滚动条在侧面笨拙地伸出的问题。

我测试的是将标题与正文分开并将正文放入垂直ScrollViewer,然后将标题和正文放入水平ScrollViewer中,以便它们可以水平滚动。 但是,正如您想象的那样,这不会很好,因为您必须向右滚动才能看到verticall滚动条。 我确信有一种方法可以让它在右边保持冷冻状态,但我还没弄清楚。 另一个问题是标题宽度必须与该列中任何单元格的最大可能宽度相匹配,或者所有内容都将关闭。 这是向右滚动时显示的结果:

在此处输入图像描述

我是新手来控制模板,所以我无法弄清楚这是否可行,因为我找不到合适的组件:

如果我给垂直滚动条左边的一个负边距(比如-6,0,0,0)和一个类似大小的填充到单元格块的右边(0,0,6,0),垂直滚动条在技术上应该向左移动。 我将继续尝试并尝试解决这个问题,除非有人为我提供答案(这将是非常棒的)。

编辑#1:

好吧,我取得了一些进展,并能够将滚动条的边距设置为(-17,0,0,0)。 17似乎是滚动条的宽度。 它的宽度似乎有一个特定的键:

http://msdn.microsoft.com/en-us/library/system.windows.systemparameters.verticalscrollbarwidthkey(v=vs.110).aspx

但我无法想出一种方法来将其作为XAML中边距的负偏移值插入。 在代码隐藏中做它并不难:但我宁愿把它全部保留在XAML中。 无论如何,这里是进度的截图和XAML代码部分:

在此处输入图像描述

这是XAML代码部分:

                   

使更改成为可能的重要部分是在代码片段的中途,我为ScrollBar设置了Margin =“ – 17,0,0,0”。

我目前的问题是我无法确定哪个组件向左偏移17(通过添加边距或填充)。 到目前为止,我一直在弄乱他们所有人并且没有运气。 我会在得到它后立即更新,除非有人在我之前说出来。 就目前而言,滚动条将覆盖最后一列中的任何内容,直到我修复偏移量。

编辑#2:

请参阅上面更新的XAML代码。 我所做的是向ScrollContentPresenter添加Margin =“0,0,17,0”。

一个副作用效果,我可以完全忍受,是一个事实,也抵消了标题,但你看不到,直到你一直向右滚动。 它仅影响最后一列的标题,因为ScrollContentPresenter也将其偏移…奇怪的是,因为有一个DataGridColumnHeadersPresenter,但它独立工作……所以,我将继续处理它。 不幸的是,ScrollContentPresenter没有填充,这就像魅力一样。 所以,现在我必须弄清楚如何填充它,而不是设置边距,或找出不同的方法。

类似的方法是将水平ScrollBar(即第二个网格中的一个)的边距设置为0,0,-17,0。 它将向右移动17个单位。 然后,将DataGridColumnHeaderPresenter的边距设置为0,0,-17,0。 它将向右移动17个单位。

编辑#3:

对于任何有兴趣的人来说,这是另一种方法:

在此处输入图像描述

将垂直ScrollBar的边距设置为0,-22,0,-17。 -22是我标题的高度,所以将其调整为你的标题。 此方法拉伸滚动条以覆盖两个白色框。

编辑#4:

我想出了解决方案。 请参阅我对XAML代码的回答,截图和解释。

所以,上面我已经玩了几种方法,但没有一种方法能达到我想要的完美外观和填充效果。 所以,这是我非常满意的解决方案。 我希望它能帮助别人。 我使用Blend遍历模板代码的每一行,这是我的目的最好的组合。

最后结果:

在此处输入图像描述

原谅凌乱的标题,我故意掩盖它们。 如您所见,垂直滚动条在标题和位于底部的水平滚动条之间很好地排列。 这是通过将垂直ScrollBar(位于模板的第一个网格中)的边距设置为左侧的-17来完成的。 Margin="-17,0,0,0" 。 然后我将位于模板代码中垂直滚动条正上方的ScrollContentProperty的边距设置为右侧的17, Margin="0,0,17,0 ,以确保垂直滚动条不覆盖任何当我们滚动到最右边时,这会让我们看到右边有17个单位空格的标题,这是因为我们在ScrollContentPresenter上的17个边距也会影响标题。为了解决这个问题,我创建了一个DataGridColumnHeader样式,并在右侧将边距设置为-17, Margin="0,0,-17,0" ,确保它渗透到空白区域。确保最后一列标题文本不会hover在垂直滚动条,使它在视觉上没有吸引力,我在右侧添加了17的填充, Padding="0,0,17,0"

这是我的DataGridDataGridColumnHeader XAML代码,它使这成为可能:

数据网格:

   

DataGridColumnHeader:

   

类似的方法是将水平滚动条的边距设置为-17, Margin="0,0,-17,0" ,将DataGridColumnHeader的填充设置为17, Padding="0,0,17,0" ,以及其保证金为-17, Margin="0,0,-17,0" 。 这实现了相同的结果。

更好的解决方案是建立Grid.Row =“0”Grid.RowSpan =“2” for Name =“PART_VerticalScrollBar”