在滚动时,应冻结(修复)Datagrid中的C#WPF扩展器

在滚动时,应冻结(修复)Datagrid中的C#WPF扩展器,c#,wpf,datagrid,scrollviewer,expander,C#,Wpf,Datagrid,Scrollviewer,Expander,我有一个带有扩展器的Datagrid,如下所示: <DataGrid ItemsSource="{Binding}" Name="MainDataGrid" AutoGenerateColumns="False" HorizontalAlignment="Stretch"

我有一个带有扩展器的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有一个冻结列和一些可变列。当我垂直滚动时,扩展器标题也会滚动消失。有没有办法把扩张器也冷冻起来

滚动前的数据网格:

滚动后的DataGrid(扩展器标题滚动):

我找到了一个解决办法:

一个简单的解决方法

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

private void DataGrid\u ScrollChanged(对象发送方,ScrollChangedEventArgs e)
{
var dataGrid=(dataGrid)发送方;
if(dataGrid.IsGrouping&&e.HorizontalChange!=0.0)
{
TraverseVisualTree(数据网格,例如水平偏移);
}
}
私有void TraverseVisualTree(DependencyObject引用,双偏移)
{
var count=VisualTreeHelper.GetChildrenCount(参考);
如果(计数=0)
返回;
for(int i=0;i
资料来源:

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

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);
        }
    }
}