我',使用ScrollIntoView
滚动到列表中最顶层的项目(默认情况下,它总是滚动到底部项目,但在某些特定情况下我需要另一种方式)
因此首先将项目添加到列表中,然后调用ScrollIntoView(Items[0])
。
ScrollIntoView在Dispatcher.BeginInvoke
内调用,因此它位于UI线程中。
一般的想法是用户看到包含项目“简短”描述的初始列表,然后选择其中一个,并查看所有信息,其中也包含“短”部分。
即:
1)
2)
因此,当我点击案例1中的元素1时,我希望看到图片2.但有时我会看到
我注意到,例如,当光标停留在列表框上时,视图总是正确更新。我已经检查了“AddItem”和“ScrollTop”方法的callstack,它们的顺序正确,并且“ScrollTop”总是被正确调用。
在所有其他情况下(当我拿起第2项或第0项时)“ScrollTop”运作良好。
所以我认为这是某种WPF优化。因为1)中的第1项信息与案例2)中的第1项信息相同且位于同一位置。每次WPF都不会更新视图。
有没有办法,每次滚动到顶部后都要更新列表框?
我试过UpdateLayout()
。它没有帮助。
更新(代码示例): 主线程代码:
UIManager.AddListItem(item1);
UIManager.AddListItem(item2);
UIManager.AddListItem(item3);
UIManager.ScrollToTop();
UIManager实施:
public void AddListItem(ListItem item)
{
ExecuteUI(() =>
{
MyList.AddItem(item);
});
}
public void ScrollToTop()
{
ExecuteUI(() =>
{
MyList.ScrollToTop();
});
}
MyListModel实现:
public void AddItem(ListItem item)
{
lock (linesLock)
{
if (Lines == null)
Lines = new ObservableCollection<ItemModel>();
ItemModel line = new ItemModel(item);
Lines.Add(line); //When line added it automatically scrolls to it
// via ((INotifyCollectionChanged)ListLines.Items).CollectionChanged += LinesChanged;
}
}
public void ScrollToTop()
{
if (Lines.Count == 0 || ScrollEvent == null)
return;
ScrollEvent(this, new ScrollEventArgs(Lines[0]));
// via Model.ScrollEvent += ScrollEvent;
}
模型xaml代码:
// ListLines is a ListBox
private void LinesChanged(object sender, NotifyCollectionChangedEventArgs e)
{
ListLines.ScrollIntoView(e.NewItems[0]);
}
private void ScrollEvent(object sender, ScrollEventArgs e)
{
ListLines.ScrollIntoView(e.Item);
}
答案 0 :(得分:0)
尝试使用ScrollToVerticalOffset
的{{1}}或ScrollToTop
方法:
ScrollViewer
但请始终记得在提问时提供Minimal, Complete, and Verifiable example您的问题。