¿Cómo obtener la posición de la barra de desplazamiento de ItemsControl mediante programación?
Tengo un comportamiento adjunto a un ItemsControl que se desplaza hacia la parte inferior cada vez que se agrega un nuevo elemento. Ya que estoy trabajando en un programa de tipo de chat, no quiero que se desplace si el usuario tiene la barra de desplazamiento en otro lugar que no sea la parte inferior, ya que de lo contrario sería muy molesto (algunos programas de chat hacen esto y es horrible).
¿Cómo logro esto? No sé cómo acceder al enrutador ScrollViewer, o de otra manera averiguar si necesito mostrarlo o no.
Esta es la clase de comportamiento que realmente recibí de alguien en StackOverflow. Todavía estoy aprendiendo sobre los comportamientos a mí mismo.
public class ScrollOnNewItem : Behavior<ItemsControl>
{
protected override void OnAttached()
{
AssociatedObject.Loaded += OnLoaded;
AssociatedObject.Unloaded += OnUnLoaded;
}
protected override void OnDetaching()
{
AssociatedObject.Loaded -= OnLoaded;
AssociatedObject.Unloaded -= OnUnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
var incc = AssociatedObject.ItemsSource as INotifyCollectionChanged;
if (incc == null) return;
incc.CollectionChanged += OnCollectionChanged;
}
private void OnUnLoaded(object sender, RoutedEventArgs e)
{
var incc = AssociatedObject.ItemsSource as INotifyCollectionChanged;
if (incc == null) return;
incc.CollectionChanged -= OnCollectionChanged;
}
private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
int count = AssociatedObject.Items.Count;
if (count == 0)
return;
var item = AssociatedObject.Items[count - 1];
var frameworkElement = AssociatedObject.ItemContainerGenerator.ContainerFromItem(item) as FrameworkElement;
if (frameworkElement == null) return;
frameworkElement.BringIntoView();
}
}
}