2009-06-17 5 views

Respuesta

27

Sí, tendrá que tomar el ScrollViwer del ListView, o bien, una vez que tenga acceso a él, puede usar los métodos expuestos o anular el desplazamiento. También puede desplazarse al obtener el área de contenido principal y usar su implementación de la interfaz IScrollInfo.

Aquí hay un poco de ayuda para obtener el componente ScrollViwer de algo así como un cuadro de lista, ListView, etc.

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; 
} 

Y a continuación, puedes utilizar .LineUp() y .LineDown() así:

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> 

El desplazamiento lógico expuesto por LineUp y LineDown todavía se desplaza por el elemento, si desea desplazarse por una cantidad determinada, debe usar ScrollToHorizontal/VerticalOffset que he utilizado anteriormente. Si desea un desplazamiento más complejo también, eche un vistazo a la respuesta que he proporcionado en este other question.

+2

Para desplazamiento vertical hacia abajo y hacia arriba, está agregando 3 a 'VerticalOffset'. ¿Es correcto? Para arriba, necesitamos restar 3, en lugar de agregar. – Syed

3

¿Has probado ScrollIntoView? De forma alternativa, si no se trata de un elemento específico que visualizó, sino un desplazamiento de la posición actual, puede usar BringIntoView.

+0

Gracias no, no he visto esos. –

Cuestiones relacionadas