Видимые строки в DataGrid отключены на 1 (подсчитывается с использованием ContainerFromItem)

У меня есть DataGrid переменных размеров в зависимости от разрешения экрана. Мне нужно знать, сколько строк видно пользователю. Вот мой код:

uint VisibleRows = 0;
var TicketGrid = (DataGrid) MyWindow.FindName("TicketGrid");

foreach(var Item in TicketGrid.Items) {
    var Row = (DataGridRow) TicketGrid.ItemContainerGenerator.ContainerFromItem(Item);
    if(Row != null && Row.IsVisible) {
        VisibleRows++;
    }
}

Я использую следующий код для проверки Vars:

MessageBox.Show(String.Format("{0} of {1} rows visible", VisibleRows, TicketGrid.Items.Count));
  • Когда в сетке нет строк, она правильно показывает 0 из 0 видимых строк:

  • Когда в сетке есть 1 строка, она правильно показывает 1 из 1 видимых строк:

  • Когда в сетке 9 строк, она правильно показывает 9 из 9 видимых строк:

  • Следующая строка "наполовину видима", поэтому я буду считать, что 10 из 10 строк отображаются правильно:

  • Однако следующая строка, которая должна быть добавлена, очевидно видима, неправильно отображая 11 из 11 видимых строк:

  • Строки, добавленные после этого, являются правильными (за исключением 1), например, 11 из 18 видимых строк:


Я не могу просто - 1потому что это неверно только после добавления определенного числа. Я не могу проверить > 10потому что размеры являются переменными.

Как я могу это исправить?

1 ответ

Решение

Вот что в итоге сработало для меня:

uint VisibleRows = 0;
var TicketGrid = (DataGrid) MyWindow.FindName("TicketGrid");

foreach(var Item in TicketGrid.Items) {
    var Row = (DataGridRow) TicketGrid.ItemContainerGenerator.ContainerFromItem(Item);

    if(Row != null) {
        /*
           This is the magic line! We measure the Y position of the Row, relative to
           the TicketGrid, adding the Row's height. If it exceeds the height of the
           TicketGrid, it ain't visible!
        */

        if(Row.TransformToVisual(TicketGrid).Transform(new Point(0, 0)).Y + Row.ActualHeight >= TicketGrid.ActualHeight) {
            break;
        }

        VisibleRows++;
    }
}

До и включая строку 9 показывает 9 из 9 видимых. "Полу-видимый" ряд 10 приводит к 9 из 10 видимых. На самом деле для моих целей лучше, чтобы это не считалось видимой строкой, так что это подойдет мне!:)

Примечание: если вы повторно используете мой код без использования breakлюбые невидимые строки после строки, вызывающей ошибку NullRefException,

Другие вопросы по тегам