2009-06-17 88 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

相关问题