2014-01-29 3 views
3

искал по сети за ответ, но я ничего, что делает это не нашел:Изменение точной прокрутки-позиции в Listview

Я хочу изменить точное положение в WPF-списка МЭН программно. Некоторые способ сказать

ListView.Scrollposition.Y = some value; 

Единственное, что я могу найти, чтобы изменить значение объекта в Listview, а не конкретные координаты. Если у кого-нибудь есть хорошие статьи или сообщения в этом разделе, я был бы очень благодарен!

Спасибо.

ответ

4

Нет способа сделать это, используя элемент ListView. Вместо этого вам необходимо получить доступ к его ScrollViewer, а затем вы можете использовать ScrollViewer.ScrollToVerticalOffset Method, чтобы установить вертикальное положение ScrollViewer. Вам также необходимо будет использовать ScrollViewer.VerticalOffset, ScrollViewer.VerticalOffset, ScrollViewer.ViewportHeight и ScrollViewer.ExtentHeight свойства, чтобы узнать, где вы находитесь: ScrollViewer.

С ScrollViewer Class страницы на MSDN:

Область, которая включает в себя все содержание ScrollViewer является степень. Видимой областью содержимого является область просмотра.

Наконец, как вы получаете ScrollViewer от ListView? Я не могу гарантировать, что это будет работать на ListView, но это делается на ListBox. Вы можете использовать VisualTreeHelper.GetChild Method вникать в визуальном дереве ListView и он должен содержать Border и затем ScrollViewer, так что вы должны быть в состоянии сделать что-то вроде этого:

Border border = (Border)VisualTreeHelper.GetChild(YourListView, 0); 
ScrollViewer scrollViewer = VisualTreeHelper.GetChild(border, 0) as ScrollViewer; 
if (scrollViewer != null) 
{ 
    scrollViewer.ScrollToVerticalOffset(60.0); 
} 

Если вы сделать получите ошибку с тем, что возвращает метод GetChild, его можно будет легко отрегулировать, отлаживая его. Просто поставьте точку останова и посмотрите, что такое тип каждого дочернего элемента, и добавьте еще одну строку с одним из этих элементов ... в конце концов, он должен найти ScrollViewer. Однако, я думаю, что этот код должен быть в порядке.

+0

Очень углубленные ответ, я буду взгляд на класс Scrollviewer, почти знал, что это должно быть ... Спасибо за этот замечательный ответ! :) – Tokfrans

4

Если это ListView то сначала вам нужно найти ScrollViewer:

private ScrollViewer FindScrollViewer(DependencyObject d) 
{ 
    if (d is ScrollViewer) 
     return d as ScrollViewer; 

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(d); i++) 
    { 
     var sw = FindScrollViewer(VisualTreeHelper.GetChild(d, i)); 
     if (sw != null) return sw; 
    } 
    return null; 
} 

и когда вы найдете его, то вы можете ScrollToVerticalOffset

var sw = FindScrollViewer(listView); 
if (sw != null) sw.ScrollToVerticalOffset(x); 
+2

Спасибо! Очень хороший ответ :) – Tokfrans

+0

Нет проблем. Вы не указали, почему хотите прокручивать, но вы также можете просмотреть ['ListBox.ScrollIntoView'] (http://msdn.microsoft.com/en-us/library/system.windows.controls.listbox.scrollintoview (v = vs.110) .aspx), который позволяет вам отображать конкретный элемент. – dkozl

+0

О, извините. Я пытаюсь реализовать функцию кинетической прокрутки в своих списках Listviews, поэтому мне очень нужна очень точная прокрутка, а не элемент за штукой (так как это не имеет смысла для этой цели) – Tokfrans

Смежные вопросы