Видимые строки в 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
,