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.
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