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