cómo hacer que la regla de desplazamiento siempre al final de la lista automática de ListView sin foco en WPF?ListView desplácese al último elemento WPF C#
Respuesta
Usar una propiedad adjunta. Este artículo le mostrará cómo: http://michlg.wordpress.com/2010/01/17/listbox-automatically-scroll-to-bottom/
se puede utilizar este, su trabajo para mí:
this.myListView.ScrollIntoView (myListView.Items [myListView.Items.Count-1]);
si necesita detalle más avanzado puede refere a este post
Dado que la respuesta de @ pduncan no incluye el código real, aquí está el código desde el enlace que se publican con sólo una pequeña modificación de mí:
public class ListBoxExtenders : DependencyObject
{
public static readonly DependencyProperty AutoScrollToEndProperty = DependencyProperty.RegisterAttached("AutoScrollToEnd", typeof(bool), typeof(ListBoxExtenders), new UIPropertyMetadata(default(bool), OnAutoScrollToEndChanged));
/// <summary>
/// Returns the value of the AutoScrollToEndProperty
/// </summary>
/// <param name="obj">The dependency-object whichs value should be returned</param>
/// <returns>The value of the given property</returns>
public static bool GetAutoScrollToEnd(DependencyObject obj)
{
return (bool)obj.GetValue(AutoScrollToEndProperty);
}
/// <summary>
/// Sets the value of the AutoScrollToEndProperty
/// </summary>
/// <param name="obj">The dependency-object whichs value should be set</param>
/// <param name="value">The value which should be assigned to the AutoScrollToEndProperty</param>
public static void SetAutoScrollToEnd(DependencyObject obj, bool value)
{
obj.SetValue(AutoScrollToEndProperty, value);
}
/// <summary>
/// This method will be called when the AutoScrollToEnd
/// property was changed
/// </summary>
/// <param name="s">The sender (the ListBox)</param>
/// <param name="e">Some additional information</param>
public static void OnAutoScrollToEndChanged(DependencyObject s, DependencyPropertyChangedEventArgs e)
{
var listBox = s as ListBox;
if (listBox != null)
{
var listBoxItems = listBox.Items;
var data = listBoxItems.SourceCollection as INotifyCollectionChanged;
var scrollToEndHandler = new System.Collections.Specialized.NotifyCollectionChangedEventHandler(
(s1, e1) =>
{
if (listBox.Items.Count > 0)
{
listBoxItems.MoveCurrentToLast();
listBox.ScrollIntoView(listBoxItems.CurrentItem);
}
});
if ((bool)e.NewValue)
data.CollectionChanged += scrollToEndHandler;
else
data.CollectionChanged -= scrollToEndHandler;
}
}
}
he modificado para utilizar MoveCurrentToLast
en lugar de obtener el último elemento con listBox.Items[listBox.Items.Count - 1];
. La razón de esto (aparte de ser un poco más limpio) es que hay un caso límite en el que si tienes elementos duplicados en una lista, entonces obtener listBox.Items.Count - 1
y luego desplazarte a ese elemento podría no deslizarte hasta el final de la lista (incluso podría desplazarte en la dirección opuesta!). En su lugar, lo desplazará a la primera instancia de ese elemento.
Las respuestas de @pduncan y @MattBurland ambos tienen algunos problemas, principalmente que no logran eliminar el registro de la conducta adecuada.
Esta aplicación almacena el controlador en otra propiedad adjunta para que pueda cambiar el comportamiento dentro y fuera, quizás a través de un enlace.
Tenga en cuenta que esto se aplica a ListView
. Si está utilizando ListBox
, cambie las ocurrencias de ListView
a ListBox
.
public static class ListViewExtensions
{
public static readonly DependencyProperty AutoScrollToEndProperty = DependencyProperty.RegisterAttached("AutoScrollToEnd", typeof(bool), typeof(ListViewExtensions), new UIPropertyMetadata(OnAutoScrollToEndChanged));
private static readonly DependencyProperty AutoScrollToEndHandlerProperty = DependencyProperty.RegisterAttached("AutoScrollToEndHandler", typeof(NotifyCollectionChangedEventHandler), typeof(ListViewExtensions));
public static bool GetAutoScrollToEnd(DependencyObject obj) => (bool)obj.GetValue(AutoScrollToEndProperty);
public static void SetAutoScrollToEnd(DependencyObject obj, bool value) => obj.SetValue(AutoScrollToEndProperty, value);
private static void OnAutoScrollToEndChanged(DependencyObject s, DependencyPropertyChangedEventArgs e)
{
var listView = s as ListView;
if (listView == null)
return;
var source = (INotifyCollectionChanged)listView.Items.SourceCollection;
if ((bool)e.NewValue)
{
NotifyCollectionChangedEventHandler scrollToEndHandler = delegate
{
if (listView.Items.Count <= 0)
return;
listView.Items.MoveCurrentToLast();
listView.ScrollIntoView(listView.Items.CurrentItem);
};
source.CollectionChanged += scrollToEndHandler;
listView.SetValue(AutoScrollToEndHandlerProperty, scrollToEndHandler);
}
else
{
var handler = (NotifyCollectionChangedEventHandler)listView.GetValue(AutoScrollToEndHandlerProperty);
source.CollectionChanged -= handler;
}
}
}
utilizar de esta manera:
<ListView local:ListViewExtensions.AutoScrollToEnd="{Binding Path=AutoScroll}">
También hice un una clase estática, ya que no es necesario crear una instancia (ni necesita derivar de DependencyObject
). El lanzamiento al INotifyCollectionChanged
se modificó para que los errores surgen como excepciones de lanzamiento, no NRE.
Para mí, éstos funcionan si cada registro en el cuadro de lista es diferente. Si son iguales, simplemente se desplaza al primero que coincida.
- 1. android listview desplácese al número de listitems
- 2. WPF ListBox Desplácese hasta el final automáticamente
- 3. WPF ListView Seleccionar programáticamente elemento
- 4. Agregar elemento al control Listview
- 5. CSS3 acceder al último elemento
- 6. Establecer elemento de enfoque en ListView WPF
- 7. Desplácese ListViewItem para estar en la parte superior de un ListView
- 8. WPF Listview SelectionChanged evento
- 9. Plantilla de elemento distintivo para el primer y último elemento en un ListView
- 10. Iterador al último elemento en std :: list
- 11. Retirar al último elemento con LINQ
- 12. Android: ListView, Último artículo - Mostrar más
- 13. WPF contextmenu y ListView
- 14. Desplácese a WPF FlowDocumentScrollViewer desde el código?
- 15. Multiset borrar último elemento
- 16. Desplácese hasta el primer elemento de jcarousel
- 17. wpf listview perdió el foco
- 18. C# WPF Arrastrar para reordenar Listview
- 19. WPF unión al elemento de
- 20. cómo mantener un elemento enfocado en C# listview?
- 21. Cómo obtener el elemento bajo el cursor en WPF ListView
- 22. Cómo aplicar: desplácese hacia un elemento
- 23. Desplácese sobre un elemento oculto para mostrarlo
- 24. (WPF) Animación ListView item move
- 25. WPF ListView SelectedItem es nulo
- 26. Sintaxis más bonita para "puntero al último elemento", std :: vector?
- 27. elemento listview androide altura
- 28. WPF ListViewItem elemento casilla
- 29. ListView elemento animado único
- 30. WPF Data virtualizando ListView
Esta es la solución más correcta. También es impresionante que algo se logró en WPF con solo 37 líneas (más comentarios). – Grault
Los enlaces se vuelven obsoletos, sería útil incluir el código * en su respuesta * –