Wie kann ich die Position der ItemsControl-Bildlaufleiste programmgesteuert ermitteln?
Ich habe ein Verhalten an ein ItemsControl angehängt, das beim Hinzufügen eines neuen Elements nach unten scrollt. Da ich an einem Chat-Programm arbeite, möchte ich nicht, dass der Benutzer einen Bildlauf durchführt, wenn die Bildlaufleiste nicht ganz unten ist, da dies sonst sehr ärgerlich wäre (einige Chat-Programme tun dies und es ist schrecklich).
Wie mache ich das? Ich weiß nicht, wie ich auf den umhüllenden ScrollViewer zugreifen soll oder auf andere Weise herausfinden soll, ob ich ihn anzeigen muss oder nicht.
Dies ist die Verhaltensklasse, die ich tatsächlich von jemandem auf StackOverflow erhalten habe. Ich lerne immer noch selbst über Verhaltensweisen.
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();
}
}
}