2009-06-17 87 views

回答

27

是的,你必須從ListView中抓取ScrollViwer,或者一旦你有權訪問它,你可以使用它暴露的方法或重寫滾動。您還可以通過獲取主要內容區域並使用其界面的實現進行滾動。

這裏有一個小幫手,得到的東西就像一個列表框,ListView中ScrollViwer組件等

public static DependencyObject GetScrollViewer(DependencyObject o) 
{ 
    // Return the DependencyObject if it is a ScrollViewer 
    if (o is ScrollViewer) 
    { return o; } 

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(o); i++) 
    { 
     var child = VisualTreeHelper.GetChild(o, i); 

     var result = GetScrollViewer(child); 
     if (result == null) 
     { 
      continue; 
     } 
     else 
     { 
      return result; 
     } 
    } 
    return null; 
} 

然後你可以使用.LineUp()和.LineDown()這樣的:

private void OnScrollUp(object sender, RoutedEventArgs e) 
{ 
    var scrollViwer = GetScrollViewer(uiListView) as ScrollViewer; 

    if (scrollViwer != null) 
    { 
     // Logical Scrolling by Item 
     // scrollViwer.LineUp(); 
     // Physical Scrolling by Offset 
     scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset + 3); 
    } 
} 

private void OnScrollDown(object sender, RoutedEventArgs e) 
{ 
    var scrollViwer = GetScrollViewer(uiListView) as ScrollViewer; 

    if (scrollViwer != null) 
    { 
     // Logical Scrolling by Item 
     // scrollViwer.LineDown(); 
     // Physical Scrolling by Offset 
     scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset + 3); 
    } 
} 


<DockPanel> 
    <Button DockPanel.Dock="Top" 
      Content="Scroll Up" 
      Click="OnScrollUp" /> 
    <Button DockPanel.Dock="Bottom" 
      Content="Scroll Down" 
      Click="OnScrollDown" /> 
    <ListView x:Name="uiListView"> 
     <!-- Content --> 
    </ListView> 
</DockPanel> 

通過LineUp和LineDown暴露的邏輯滾動仍然按項目滾動,如果您想滾動一定數量,則應使用上面使用的ScrollToHorizo​​ntal/VerticalOffset。如果您還想要更復雜的滾動,請查看我在other question中提供的答案。

+2

對於垂直向下滾動和向上滾動,您都將3添加到「垂直偏移」。這是對的嗎?最後,我們需要減去3,而不是添加。 – Syed 2013-03-01 06:26:21

3

你試過ScrollIntoView? 或者,如果它不是您放入視圖中的特定項目,而是距當前位置的偏移量,則可以使用BringIntoView

+0

謝謝不,沒有看到那些。 – 2009-06-17 19:46:39

相關問題