在滚动时,应该冻结(修复)Datagrid中的C#WPF Expander

时间:2015-08-14 13:31:14

标签: c# wpf datagrid scrollviewer expander

我有一个带扩展器的Datagrid,如下所示:

<DataGrid ItemsSource="{Binding}" Name="MainDataGrid" 
                                      AutoGenerateColumns="False"                   
                                      HorizontalAlignment="Stretch"
                                      VerticalAlignment="Stretch"    
                                      SelectionMode="Extended"
                                      CanUserDeleteRows="False" 
                                      CanUserAddRows="False" 
                                      SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical"
                                      >
        <DataGrid.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <Expander Background="#F0F7FC" BorderThickness="0" BorderBrush="BlanchedAlmond" >
                                        <Expander.Header>

                                            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                                                <TextBlock Text="Text"  />
                                            </StackPanel>
                                        </Expander.Header>
                                        <ItemsPresenter />
                                    </Expander >
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>

        </DataGrid.GroupStyle>
    </DataGrid>

datagrid有一个冻结列和一些可变列。当我垂直滚动时,扩展器标题也会滚动并消失。有没有办法冻结扩张器heaeder?

滚动前的

DataGrid:

Before scrolling

滚动后的

DataGrid(Expander标题滚动):

After scrolling - Expander Header scrolls away

1 个答案:

答案 0 :(得分:1)

我找到了解决方法:

  

简单的解决方法

     

我想到的最简单的解决方法是每次DataGrid水平滚动时调整标题的左边距。为此,我们可以订阅DataGrid的ScrollViewer的ScrollChanged事件,获取组头并设置其边距。在我们的例子中,我们使用了Expander,因此我们需要找到ToggleButton并设置其左边距。以下代码清单显示了ScrollChanged事件的事件处理程序以及使用VisualTreeHelper实用程序类搜索ToggleButton的递归方法。

private void DataGrid_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
    var dataGrid = (DataGrid)sender;
    if (dataGrid.IsGrouping && e.HorizontalChange != 0.0)
    {
        TraverseVisualTree(dataGrid, e.HorizontalOffset);
    }
}

private void TraverseVisualTree(DependencyObject reference, double offset)
{
    var count = VisualTreeHelper.GetChildrenCount(reference);
    if (count == 0)
        return;

    for (int i = 0; i < count; i++)
    {
        var child = VisualTreeHelper.GetChild(reference, i);
        if (child is ToggleButton)
        {
            var toggle = (ToggleButton)child;
            toggle.Margin = new Thickness(offset, 0, 0, 0);
        }
        else
        {
            TraverseVisualTree(child, offset);
        }
    }
}

来源:http://www.nullskull.com/a/1509/freeze-row-group-header-in-wpf-datagrid.aspx

这不是完美的解决方案,但对于我的项目来说还可以!