4

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

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

有什么线索吗?

编辑 1

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

编辑 2 我添加了一张图片,试图展示我想要实现的目标。红线上方的区域是不可见的。在此处输入图像描述

4

4 回答 4

-1

您可以通过将新项目添加到可观察集合的顶部来轻松实现这一点

obsData.Insert(0,newItem)

参考

于 2013-11-28T13:30:21.560 回答
-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 有效。因此,出于某种原因,ScrollToVerticalOffset 在更改 VerticalScrollBarVisibility 后无法立即工作。如果你能弄清楚最后一部分,我相信你的问题会得到解决

于 2013-11-28T01:56:49.530 回答
-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); 
于 2013-11-28T11:10:15.257 回答
-2

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

yourLongListMultiSelector.ScrollTo(yourNewInsertedItem);
于 2013-11-19T18:41:10.543 回答