冻结DataGrid Row

我想知道在.net 4.0中的WPF数据网格中是否可能有一个静态行。

我想要实现的是创建一个静态行(第0行),当数据网格向下滚动时,它将始终显示在顶部。

我们的想法是,当用户滚动数据网格时,第0行将始终处于视图中。

谢谢。

这个“简单的解决方案”仅适用于可冻结的页脚,冻结的标题解决方案会有所不同(实际上更容易 – 只需使用HeaderTeamplate – 将堆叠面板与所需的多个项目堆叠起来)。

所以我需要一个可以冻结的页脚行,我几个月都找不到任何东西,所以最后我决定不再懒惰并进行调查。

因此,如果你需要一个页脚,那么要点就是在行之间的DataGrid模板和水平滚动查看器中找到一个位置,在那里你可以使用带有单元格的ItemsControl来挤压额外的Grid.Row。

攻击计划:

首先,提取DataGrid模板(我使用Blend)。 熟悉模板后,请按顺序记下部件:

PART_ColumnHeadersPresenter PART_ScrollContentPresenter PART_VerticalScrollBar 

在PART_VerticalScrollBar下面,有一个网格(为了清楚起见,我会在这里发布)

        

这是我修改的网格,包括“freezable / footer row”。 我将简单地对颜色进行硬编码,并为了简单而将Binding替换为具有良好帮助的“假装”属性(我将它们标记为“MyViewModel.SomeProperty,因此它们很容易看到):

             MY FOOTER                    

还添加到DataGrid响应滚动和标题大小调整

    

现在,回到.xaml.cs

基本上需要两件主要的事情:

(1)同步列resize(以便相应的页脚单元格resize)(2)同步DataGrid滚动与页脚滚动

 //syncs the footer with column header resize private void OnDatagridScrollChanged(object sender, ScrollChangedEventArgs e) { if (e.HorizontalChange == 0.0) return; FooterScrollViewer.ScrollToHorizontalOffset(e.HorizontalOffset); } //syncs scroll private void OnDataColumnSizeChanged(object sender, SizeChangedEventArgs e) { //I don't know how many of these checks you need, skip if need to the gist if (!_isMouseDown) return; if (!_dataGridLoaded) return; if (!IsVisible) return; var header = (DataGridColumnHeader)sender; var index = header.DisplayIndex - ViewModel.NumberOfHeaderColumns; if (index < 0 || index >= FooterCells.Count) return; FooterCells[index].Width = e.NewSize.Width; } //below referencing supporting properties: private ScrollViewer _footerScroll; private ScrollViewer FooterScrollViewer { get { return _footerScroll ?? (_footerScroll = myDataGrid.FindVisualChildByName("PART_Footer_ScrollViewer")); } } //added this so I don't have to hunt them down from XAML every time private List _footerCells; private List FooterCells { get { if (_footerCells == null) { var ic = myDataGrid.FindVisualChildByName("PART_Footer"); _footerCells = new List(); for (var i = 0; i < ic.Items.Count; i++) { var container = ic.ItemContainerGenerator.ContainerFromIndex(i); var border = ((Visual)container).FindVisualChild(); _footerCells.Add(border); } } return _footerCells; } } 

而已! 我认为最重要的部分是XAML,看看你可以把你的“freezable row”放在哪里,其他一切,比如操纵/同步东西都很容易 – 几乎是一个衬里)

我不确定行,但您可以使用FrozenColumnCount冻结列。 这样它总是可见的。 应该有一个冻结属性。