2014-01-29 172 views
3

被四處撒網的答案尋找,但我沒有發現任何東西,這是否:更改完全滾動位置在ListView

我想換一個WPF名單的確切位置IEW編程。某種說法

ListView.Scrollposition.Y = some value; 

我唯一能找到的就是將值更改爲Listview中的一個對象,而不是具體的座標。 如果有人有一些好的文章或這個主題的帖子,我會很感激!

謝謝。

回答

4

使用ListView元素沒有辦法做到這一點。相反,您需要訪問其ScrollViewer,然後可以使用ScrollViewer.ScrollToVerticalOffset Method設置ScrollViewer的垂直位置。您還需要使用ScrollViewer.VerticalOffset,ScrollViewer.VerticalOffset,ScrollViewer.ViewportHeightScrollViewer.ExtentHeight屬性來測量您在ScrollViewer中的位置。

ScrollViewer Class頁上MSDN:

包括所有的ScrollViewer的內容是程度的面積。內容的可見區域是視口。

最後,您如何從ListView獲得ScrollViewer?我不能保證這將在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/zh-cn/library/system.windows.controls.listbox.scrollintoview (v = vs.110).aspx),它可以讓你將特定物品放入視圖 – dkozl

+0

哦,對不起。我試圖在我的Listviews中實現一個動態滾動功能,所以我真的想要一個非常精確的滾動而不是逐項的方式(因爲這沒有意義) – Tokfrans