我有一个带扩展器的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:
滚动后的DataGrid(Expander标题滚动):
答案 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
这不是完美的解决方案,但对于我的项目来说还可以!