【问题标题】:C# WPF Expander in Datagrid should be frozen (fix) while scrolling滚动时应冻结(修复)Datagrid 中的 C# WPF Expander
【发布时间】:2015-08-14 13:31:14
【问题描述】:

我有一个带有 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:

DataGrid 滚动后(Expander 标头滚开):

【问题讨论】:

    标签: c# wpf datagrid scrollviewer expander


    【解决方案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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      相关资源
      最近更新 更多