Podemos hacerlo obteniendo el ScrollViewer que está presente en ControlTemplate de ListView. Si tiene acceso a un ScrollViewer, entonces hay a lot de diferentes métodos de desplazamiento expuestos.
En primer lugar, podemos crear un ListView que queremos añadir este efecto a:
<ListView ItemsSource="{Binding Percents}"
SelectionChanged="OnSelectionChanged"
x:Name="uiListView"/>
public List<int> Percents { get; set; }
public Window1()
{
InitializeComponent();
Percents = new List<int>();
for (int i = 1; i <= 100; i++)
{
Percents.Add(i);
}
this.DataContext = this;
}
También necesitaremos algo que podemos utilizar para obtener el ScrollViewer de la Vista de la lista. He usado algo similar a esto antes para trabajar con desplazamiento personalizado, y podemos usarlo aquí también.
public static DependencyObject GetScrollViewer(DependencyObject o)
{
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;
}
Ahora, solo tenemos que manejar el evento SelectionChanged. Debido a que estamos tratando de desplazar un elemento a la parte superior de la lista, la mejor opción es desplazarse hacia la parte inferior y luego volver a desplazarse hacia arriba hasta nuestro elemento seleccionado. Como dijiste, ScrollIntoView se desplazará solo hasta que el elemento sea visible, de modo que una vez que el elemento seleccionado llegue a la parte superior a medida que se desplaza hacia atrás, dejará de dejar nuestro elemento seleccionado en la parte superior de la lista.
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
ScrollViewer scrollViewer = GetScrollViewer(uiListView) as ScrollViewer;
scrollViewer.ScrollToBottom();
uiListView.ScrollIntoView(e.AddedItems[0]);
}
Perfecto :) Gracias – Ray
Funciona como un encanto para mí. Gracias !!! – thowa
Nota: si está utilizando el WPF Extended Toolkit, puede obtener el ScrollViewer en una línea de código: VisualTreeHelperEx.FindDescendantByType (YourListView); –