我有一个附加的行为到一个ItemsControl滚动到底部,每当添加一个新的项目。由于我正在使用聊天类型的程序,因此如果用户的滚动条不在最底部,那么我不希望它滚动,否则会非常烦人(有些聊天程序会这样做,这很糟糕)。如何以编程方式获取ItemsControl滚动条位置?
我该如何做到这一点?我不知道如何访问包装ScrollViewer,或者弄清楚我是否需要将它放入视图中。
这是我从StackOverflow上的某个人得到的行为类。我仍然在自己学习行为。
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();
}
}
}
如果你提供代码如何使用这个类,会更好! – Nolesh
我继续前进,编辑底部以显示如何使用它。这只是在视图中添加行为的问题。 – Cowman
感谢您的答复! +1 – Nolesh