我有一个ListBox
必须自动滚动到底部。在我的应用程序中,我必须检测用户是否已经看到某些项目,并且如果有的话可以执行一些业务逻辑。我在这里使用虚拟化,只有在可见时才调用item(vm)属性。列表框滚动查看器 - 默认滚动到底
对于自动滚动,我使用listbox.ScrollIntoView(listbox.SelectedItem);
这完美的作品,问题是,ScrollIntoView
将意味着它首先显示从它开始有些项目只运行后ListBox
已经加载和渲染之后,它会滚动到底...这对我来说是不受欢迎的。我只想立即滚动到底部(在呈现ListBox
之前)。
这里是我的自动滚动行为底部:
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.SelectionChanged += AssociatedObject_SelectionChanged;
}
void AssociatedObject_SelectionChanged(object sender, EventArgs e)
{
if (sender is ListBox)
{
ListBox listbox = (sender as ListBox);
if (listbox.SelectedItem != null)
{
listbox.Dispatcher.BeginInvoke((Action)(() =>
{
listbox.UpdateLayout();
if (listbox.SelectedItem != null)
{
listbox.ScrollIntoView(listbox.SelectedItem);
}
}));
}
}
}
protected override void OnDetaching()
{
base.OnDetaching();
this.AssociatedObject.SelectionChanged -= AssociatedObject_SelectionChanged;
}
我ListBox
是设置好的,以IsSynchronizedWithCurrentItem="True"
及其ItemsSource
是我现在用MoveCurrentToLast
绑定到ICollectionView
。
所以问题是:有没有办法如何滚动到底部而不先渲染顶部?
AFAIK,滚动是一个属于VisualTree的进程。如果没有树,则不会滚动。解决方案[这里](http://stackoverflow.com/a/26274919/4558029) – lokusking
向下滚动对我来说不是一个问题,效果很好......问题在于它在初始化时始终显示一些项目。我不能简单地说:嘿,只要向下滚动到底部而不显示顶部!对我来说问题是当列表达到最高点时我运行了一些命令。 –
我试过你的代码,无法重现你所描述的内容。你能提供一些数据(VM)来处理吗? – lokusking