Я получаю изображение только отображаемых предметов и нижних скрытых предметов
Это происходит потому, что ListView
, когда он не ограничен размерами контейнера, будет пытаться изменить его размер, чтобы вместить как можно больше предметовкак может начиная с первого отображаемого элемента.Другими словами, он не пытается каким-то образом отобразить «верхние скрытые элементы» (как вы их называете).
Я не уверен, возможно ли изменить это поведение, чтобы сделать true auto-sizable ListView
, но простой обходной путь - это прокрутить до самого первого элемента, сделать скриншот, а затем восстановить положение.
Добавьте это перед измерением (вам потребуется метод FindChild ):
var scroll = ListViewCtrl.FindChild<ScrollViewer>();
var offset = scroll.VerticalOffset; // store offset
scroll.ScrollToTop();
Dispatcher.Invoke(() => { }, DispatcherPriority.Background); // do events
И затем после рендеринга восстановить положение:
scroll.ScrollToVerticalOffset(offset);
Почему "делать события"?Вы должны подождать, пока wpf фактически выполнит прокрутку, прежде чем измерять.Как много вещей в wpf, что тоже откладывается, т.е. не происходит мгновенно.