Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows Phone 8长列表选择器-异步加载数据后滚动到底部_C#_Windows Phone 8_Async Await_Longlistselector - Fatal编程技术网

C# Windows Phone 8长列表选择器-异步加载数据后滚动到底部

C# Windows Phone 8长列表选择器-异步加载数据后滚动到底部,c#,windows-phone-8,async-await,longlistselector,C#,Windows Phone 8,Async Await,Longlistselector,我正在创建一个类似于股票消息的应用程序。但我对wp8开发以及c#和.net都是新手 我正在使用长列表选择器显示消息。消息将加载到页面的NavigatedTo事件。处理程序是异步的,因为它从Web服务加载数据,当本地数据库中存储了0时,它会将它们保存在本地数据库中 我想滚动到数据加载后的最后一条消息 上的页面已导航到 protected override async void OnNavigatedTo(NavigationEventArgs e) { string contactId =

我正在创建一个类似于股票消息的应用程序。但我对wp8开发以及c#和.net都是新手

我正在使用长列表选择器显示消息。消息将加载到页面的NavigatedTo事件。处理程序是异步的,因为它从Web服务加载数据,当本地数据库中存储了0时,它会将它们保存在本地数据库中

我想滚动到数据加载后的最后一条消息

上的页面已导航到

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    string contactId = "";
    if (NavigationContext.QueryString.TryGetValue("contactId", out contactId))
    {
        await App.MessagesViewModel.LoadData();

        DataContext = App.MessagesViewModel;

        //scroll to last message, but it's apparently to soon
        var lastMessage = App.MessagesViewModel.Messages.LastOrDefault();
        llsMessages.ScrollTo(lastMessage);
    }
}
但这会引发异常System.ArgumentException:集合中不存在提供的项。所以我想名单还没变

因此,我尝试了LongListSelector的不同事件,这表明它已经从视图模型添加了数据。经过一段时间的实验,我想到了这个

private void llsMessages_SizeChanged(object sender, SizeChangedEventArgs e)
{
    var lastMessage = App.MessagesViewModel.Messages.LastOrDefault();
    if (lastMessage != null)
    {
        llsMessages.ScrollTo(lastMessage);
    }
}
但这仅在从数据库加载消息时有效。从webservice加载时,最后一条消息为null

因此,加载后,我在顶部的第一条消息上,然后我离开页面,然后返回,列表滚动到底部。我想消除这一点,但我不知道如何消除


有没有办法做到这一点?

试试longlistselector的ItemRealized事件。检查选择器中当前处理的项是否是datacontext的最后一项,如果是,则滚动到该项。下面的代码为我工作

private void longlist_ItemRealized(object sender, ItemRealizationEventArgs e)
    {
        Search.BindSearch search = e.Container.Content as Search.BindSearch;
        if (search != null)
        {
            int offset = 0;

            if (OCollectionBindSearch.Count - OCollectionBindSearch.IndexOf(search) <= offset)
            {
                longlist.ScrollTo(search);
            }                
        }
    }
private void longlist\u itemcrealized(对象发送方,itemcrealizationeventargs e)
{
Search.BindSearch Search=e.Container.Content as Search.BindSearch;
如果(搜索!=null)
{
整数偏移=0;

如果(OCollectionBindSearch.Count-OCollectionBindSearch.IndexOf(search)可能会起作用:

private async Task DoAndScroll()
{
   await App.MessagesViewModel.LoadData();
   var lastMessage = App.MessagesViewModel.Messages.LastOrDefault();
   llsMessages.ScrollTo(lastMessage);
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
   string contactId = "";
   if (NavigationContext.QueryString.TryGetValue("contactId", out contactId))
   {
      DataContext = App.MessagesViewModel;  
      DoAndScroll();     
   }
}

但是当我滚动列表时,我会触发许多item realized事件,这会不会降低ui的速度?它还没有降低我的应用程序的速度,我只会在代码与我想要的项目匹配时处理代码。也许不必查看LLS SizeChanged,而是查看CollectionChanged,当添加项目时,滚动LLS。我在属性编辑器中看不到该事件或者在代码中。它是属于lls的事件吗?它是您的集合拥有(或应该拥有)的事件-App.MessagesVieModel.Messages.CollectionChanged。这只是我的松散思维,虽然我没有尝试过。也许其他解决方案是在末尾添加特殊项目,当集合更改时,您将跳转到该项目,但随后您必须在最后一个项目之前插入该项目,而不是添加。我在添加新邮件时,该项目可以正常工作。我需要跳转到t在我异步加载web服务中的所有消息后,列表结束。异步使它变得困难。我不知道LoadData()看起来如何,但我添加了一个答案,可能会有所帮助。DoAndScroll等待LoadData,然后获取lastMessage和ScrollsTo()。它也是异步运行的,因此不会阻止主UI。在您的代码中,OnNavigated被Wait LoadData()阻止,但调用OnNavigatedTo的主代码继续运行,可能导致异常。