DataGrid ScrollIntoView - как прокрутить до первой строки, которая не отображается? - PullRequest
8 голосов
/ 12 марта 2012

Я пытаюсь прокрутить вниз сетку данных WPF с кодом позади. Я использую

int itemNum=0;
private void Down_Click(object sender, RoutedEventArgs e)
{
    if (itemNum + 1 > dataGridView.Items.Count - 1) return;
    itemNum += 1;
    dataGridView.UpdateLayout();
    dataGridView.ScrollIntoView(dataGridView.Items[itemNum]);
}

Прокрутка вниз, только если строка itemNum в данный момент не отображается.

Например, если DataGrid достаточно длинный, чтобы вместить 10 строк, а у меня 20 строк, мне нужно вызвать эту функцию 11 раз (пока itemNum не равно 11), чтобы перейти к следующей строке.

Он не прокручивается вниз, если строка уже помещается в сетку (даже если она последняя на экране).

Я хочу добиться того, чтобы при вызове этого метода сетка перенесла следующую строку в верхнюю часть сетки (как это делает скроллер). Почему это не работает?

Ответы [ 2 ]

19 голосов
/ 12 марта 2012

Использовать DataGridView.FirstDisplayedScrollingRowIndex.

 int itemNum=0;
    private void Down_Click(object sender, RoutedEventArgs e)
    {
        itemNum++;
        if (itemNum > dataGridView.Items.Count - 1) return;
        //dataGridView.UpdateLayout();  <-- I don't think you need this
        dataGridView.FirstDisplayedScrollingRowIndex = itemNum;
    }

Извините, не понял, что в сетке WPF этого нет. Пункт о прокрутке остается в силе.

ScrollIntoView будет прокручиваться только в том случае, если элемент не отображается, и сделает его последней строкой, если он находится ниже текущих видимых строк, поэтому при прокрутке для просмотра 11-го элемента он выглядит так, как будто он прокручивается до второго.

Эта работа должна работать на вас. Вы прокручиваете до самого нижнего ряда, а затем прокручиваете до нужного вам ряда. Обратите внимание, что здесь вам действительно нужно обновить макет, иначе он проигнорирует результаты первой прокрутки перед повторной прокруткой вверх.

        dataGridView.ScrollIntoView(DataGrid1.Items[DataGrid1.Items.Count - 1]);
        dataGridView.UpdateLayout();
        dataGridView.ScrollIntoView(DataGrid1.Items[itemIndex]);
2 голосов
/ 05 ноября 2012

Проверьте это , это для ListBox, но понимание велико, и это может также работать для сетки:

В двух словах: элементы загружаются в ListBox асинхронно, поэтому, если вы вызываете ScrollIntoView () в событии CollectionChanged (или аналогичном), у него еще не будет элементов, поэтому прокрутка отсутствует.

Надеюсь, это поможет, это, безусловно, помогло мне! ; -)

...