C# WPF Expander в Datagrid должен быть заморожен (исправлено) при прокрутке

У меня есть Datagrid с Expander, например:

<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 прокручивается):

После прокрутки — заголовок Expander прокручивается


person ITCHY1505    schedule 14.08.2015    source источник


Ответы (1)


Я нашел обходной путь:

Простой обходной путь

Самый простой обходной путь, о котором я подумал, — это настроить левое поле заголовка каждый раз, когда DataGrid прокручивается по горизонтали. Для этого мы можем подписаться на событие ScrollChanged объекта ScrollViewer DataGrid, получить заголовок группы и установить его маржу. Однако в нашем примере мы использовали Expander, поэтому нам нужно найти ToggleButton и установить его левое поле. В следующем листинге кода показан обработчик события ScrollChanged и рекурсивный метод, который ищет ToggleButton с помощью служебного класса VisualTreeHelper.

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

Это не идеальное решение, но для моего проекта сойдет!

person ITCHY1505    schedule 23.09.2015