WPF DataGrid Прокрутка вверх после сортировки - PullRequest
3 голосов
/ 25 августа 2011

У меня есть приложение .Net 4.0 WPF, использующее сетку данных. В настоящее время после сортировки по столбцу позиция прокрутки сетки остается там, где она была до сортировки.

Для этого приложения мне нужно прокрутить верхнюю часть сетки после любого вида.

Я пытался обработать событие сортировки следующим образом

    Private Sub myDataGrid_Sorting(sender As Object, e As System.Windows.Controls.DataGridSortingEventArgs) Handles myDataGrid.Sorting
            myDataGrid.ScrollIntoView(myDataGrid.Items(0))
    End Sub

Но, похоже, это срабатывает до того, как сортировка произойдет, и не выполняет прокрутку.

Мысли

Ответы [ 2 ]

6 голосов
/ 25 августа 2011

Я не знаю синтаксис в VB, но я думаю, что он должен быть примерно таким же. Вот это в C #:

var border = VisualTreeHelper.GetChild(myDataGrid, 0) as Decorator;
if (border != null)
{
    var scrollViewer = border.Child as ScrollViewer;
    scrollViewer.ScrollToTop();
}

Обычно первым визуальным дочерним элементом DataGrid является его декоратор, а дочерним элементом декоратора является ScrollViewer. Из ScrollViewer вы можете управлять тем, какие элементы отображаются в dataGrid.

О ... А VisualTreeHelper поможет вам перемещаться от одного визуального элемента к следующему внутри или снаружи текущего элемента, в котором вы находитесь. Я думаю, это в System.Windows.Media.

Надеюсь, это помогло. Приветствия

Редактировать: еще одну вещь, которую я забыл упомянуть, прежде чем опубликовать это ... Возможно, вам придется переопределить метод OnSorting в DataGrid.

Так что в некотором вашем производном классе от DataGrid, который будет реализовывать эту новую функциональность, у вас будет это переопределение.

protected override void OnSorting(DataGridSortingEventArgs eventArgs)
{
    base.OnSorting(eventArgs);

    var border = VisualTreeHelper.GetChild(myDataGrid, 0) as Decorator;
    if (border != null)
    {
        var scrollViewer = border.Child as ScrollViewer;
        scrollViewer.ScrollToTop();
    }
}
0 голосов
/ 25 августа 2011

Вот синтаксис VB.

Private Sub myDataGrid_Sorting(sender As Object, e As System.Windows.Controls.DataGridSortingEventArgs) Handles myDataGrid.Sorting
  Dim border As Decorator = VisualTreeHelper.GetChild(myDataGrid, 0)
    If border IsNot Nothing Then
      Dim scrollViewer As ScrollViewer = border.Child
      scrollViewer.ScrollToTop()
    End If
End Sub
...