在开头插入项目时,防止LongListMultiSelector“自动滚动”

时间:2013-11-19 14:52:57

标签: c# windows-phone-8 wpf-controls cimbalino

我正在使用LongListMultiSelector来显示消息。 最新的消息是在波士顿 - 就像信使一样。 我知道在ListHeaderTemplate中有一个按钮,它允许我加载早期的消息并将它们插入列表顶部(ObservableCollection.Insert(0, item);)。

插入作品,但看起来列表会自动滚动到最后插入的项目 - 它实际上不会滚动,但感觉就像滚动一样,因为插入后会显示新项目,但我宁愿寻找一个解决方案,保持项目可见,这是插入新项目之前的第一个项目,我必须再次垂直滚动到新的顶部再次到达列表标题。

任何线索?

编辑1

考虑,oldFirstItem是当前的第一项,然后我在项目前插入一个新项目。现在新项目成为第一项,并且由于滚动位置没有改变,新项目是可见的:感觉就像列表滚动到新插入的项目,但它只将项目1推向n。我想要的是,它将所有新项目推送到用户看不到的区域 - 并且oldFirstItem位于隐藏项目的顶部。 使用ScrollTo使该列表跳转。

编辑2 我添加了一张图片,试图展示我想要实现的目标。红线上方的区域不可见。enter image description here

4 个答案:

答案 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)

您可以通过在可观察集合中添加新项目轻松实现此目的

obsData.Insert(0,newItem)

Reference

答案 3 :(得分:-2)

如果我看到......您可以使用ScrollTo方法。

yourLongListMultiSelector.ScrollTo(yourNewInsertedItem);