我正在使用LongListMultiSelector来显示消息。
最新的消息是在波士顿 - 就像信使一样。
我知道在ListHeaderTemplate中有一个按钮,它允许我加载早期的消息并将它们插入列表顶部(ObservableCollection.Insert(0, item);
)。
插入作品,但看起来列表会自动滚动到最后插入的项目 - 它实际上不会滚动,但感觉就像滚动一样,因为插入后会显示新项目,但我宁愿寻找一个解决方案,保持项目可见,这是插入新项目之前的第一个项目,我必须再次垂直滚动到新的顶部再次到达列表标题。
任何线索?
编辑1
考虑,oldFirstItem
是当前的第一项,然后我在项目前插入一个新项目。现在新项目成为第一项,并且由于滚动位置没有改变,新项目是可见的:感觉就像列表滚动到新插入的项目,但它只将项目1推向n。我想要的是,它将所有新项目推送到用户看不到的区域 - 并且oldFirstItem
位于隐藏项目的顶部。
使用ScrollTo使该列表跳转。
编辑2 我添加了一张图片,试图展示我想要实现的目标。红线上方的区域不可见。
答案 0 :(得分:-1)
为了让你前进,我尝试了一些但却无法获得100%
这是一个有效的基本页面模板,实际上可以根据消息进行操作
<phone:PhoneApplicationPage >
<ScrollViewer x:Name="Scroll" VerticalAlignment="Bottom" Height="500" ScrollViewer.VerticalScrollBarVisibility="Disabled">
<StackPanel VerticalAlignment="Bottom" >
<toolkit:LongListMultiSelector x:Name="DataList" ItemsSource="{Binding}" ScrollViewer.VerticalScrollBarVisibility="Disabled" VerticalAlignment="Bottom"
VirtualizingStackPanel.VirtualizationMode="Recycling"></toolkit:LongListMultiSelector>
</StackPanel>
</ScrollViewer>
</phone:PhoneApplicationPage>
这会保留新邮件,将列表拉上来。滚动现已禁用。您可以轻松地将ScrollViewer包含在网格中并添加上面的按钮(如图中所示)
现在进入按钮的代码点击
Scroll.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden;
Scroll.ScrollToVerticalOffset(DataList.ActualHeight);
不幸的是,如果您再次触发第二行代码,例如通过按钮单击,ScrollToVerticalOffset可以工作,则会向上滚动列表。因此,由于某种原因,在更改VerticalScrollBarVisibility之后,ScrollToVerticalOffset无法正常工作。如果你能找到最后一部分,我相信你的问题将得到解决
答案 1 :(得分:-1)
阻止所需效果的是当您在顶部插入项目时,ListHeader控件位于顶部。你可以做一些棘手的代码来绕过它:
var temp = MyLongListMultiSelector.ListHeader; //also works with ListHeaderTemplate
MyLongListMultiSelector.ListHeader = null;
MyObservableCollection.Insert(0, item);
MyLongListMultiSelector.ListHeader = temp;
或者您可以创建一个假的标题项并处理添加顶级事件,如:
MyLongListMultiSelector.Remove(fakeHeaderItem);
MyObservableCollection.Insert(0, item);
MyObservableCollection.Insert(0, fakeHeaderItem);
答案 2 :(得分:-1)
答案 3 :(得分:-2)
如果我看到......您可以使用ScrollTo
方法。
yourLongListMultiSelector.ScrollTo(yourNewInsertedItem);