LongListSelector停止滚动并冻结

时间:2014-02-18 20:40:13

标签: c# xaml windows-phone-7 windows-phone-8 longlistselector

我在Windows Phone 8应用中有LongListSelectorPivotItem)控件。我看到一种奇怪的行为。有时LLS停止滚动。像冻结一样,我无法滚动它。但我可以使用AppBarPivotButton Back等,甚至可以使用GroupHeader和JumpList。它是随机发生的(到目前为止,我没有发现规律)而且经常发生。早些时候我经常使用LLS,但这些问题从未出现过。

以下是LLS可以冻结的典型情况。

  1. 使用LLS转到页面。
  2. 滚动LLS。
  3. 点按LLS项目并导航到其他页面。
  4. 返回使用LLS的页面。
  5. LLS未滚动。
  6. 这个包也可以以其他方式出现。

    亮点:

    • 我没有将大集合绑定到LLS(我的集合大约有10-50个项目(分为5组))。
    • 当LLS未冻结时,它的工作速度非常快且没有混蛋。
    • 我在LLS项目中有ListBox(1 - 6个字符串元素)。
    • 我使用DataTemplateSelector(as implemented here)
    • 当LLS冻结时,性能分析不会显示响应性差。

    我的XAML:

     <phone:LongListSelector Name="LLSSimpleSearch"  VirtualizingStackPanel.VirtualizationMode="Recycling"
                             ItemsSource="{Binding ListGroup}"
                             toolkit:TiltEffect.IsTiltEnabled="True"
                             Margin="12,0,-12,0"                                                                   
                             IsGroupingEnabled="True" 
                             LayoutMode="List"
                             HideEmptyGroups="False"      
                             GroupHeaderTemplate="{StaticResource LLSHeaderTemplate}"
                             JumpListStyle="{StaticResource LLSJumpList}"
                             ListFooterTemplate="{StaticResource LLSListFooter}">      
    

    的ItemTemplate

    <questionary:QuestTemplateSelector Content="{Binding}">
    <questionary:QuestTemplateSelector.Template1>
               <DataTemplate>
                    <ListBox></ListBox> <!-- ListBox with small collect-->
               </DataTemplate>
    <questionary:QuestTemplateSelector.Template1>
    
    <questionary:QuestTemplateSelector.Template2>
               <DataTemplate>
               </DataTemplate>
    </questionary:QuestTemplateSelector.Template2>
    
    <questionary:QuestTemplateSelector.Template3>
               <DataTemplate>
               </DataTemplate>
    </questionary:QuestTemplateSelector.Template3>
    
    <questionary:QuestTemplateSelector.Template4>
               <DataTemplate>
               </DataTemplate>
    </questionary:QuestTemplateSelector.Template4>
    </questionary:QuestTemplateSelector>
    

    在cs:

    LLSSimpleSearch.DataContext = GYSearchViewModel.Instance;
    GYSearchViewModel.Instance.Load();
    

    视图模型

    private ObservableCollection<Group<Quest>> _listGroup = new ObservableCollection<Group<Quest>>();
    public ObservableCollection<Group<Quest>> ListGroup
            {
                get
                {
                    return _listGroup;
                }
                set
                {
                    if (value != _listGroup)
                    {
                        _listGroup = value;
                        NotifyPropertyChanged("ListGroup");
                    }
                }
            }
    
    public Load()
    {
         MyDataSource.Load((r) => { ListGroup= r; })
    }
    

    这里奇怪吗?在这段代码中,有潜在的问题吗?如果需要,我准备提出更多意见。提前感谢您的建议。

    更新(解决问题的方法)

    我不能百分百肯定,但99%的问题是ListBox

    <questionary:QuestTemplateSelector.Template1>
                   <DataTemplate>
                        <ListBox ScrollViewer.VerticalScrollBarVisibility="Disabled"/>
                   </DataTemplate>
    <questionary:QuestTemplateSelector.Template1>
    

    我必须在列表中显示我的数据,并在ListBox内使用LLS。实验方式,经过长时间的测试,我发现了冻结的规律性。然后得出结论ListBox中的问题。在问题属性IsHitTestVisible帮助。

     <questionary:QuestTemplateSelector.Template1>
                       <DataTemplate>
                            <ListBox ScrollViewer.VerticalScrollBarVisibility="Disabled"
                                     IsHitTestVisible="false"/>
                       </DataTemplate>
        <questionary:QuestTemplateSelector.Template1>
    

    现在没有问题。

2 个答案:

答案 0 :(得分:3)

手机必须呈现的控件(或项目)越多,相对于所显示的项目总数就会减慢。在我正在研究的WP8窗口上,要呈现的50多个项目会使应用程序明显减慢到我必须重新设计这些内容如何加载和显示的程度。

是负载延迟问题,还是显示问题或两者兼而有之。您需要确定瓶颈,并决定哪些权衡将使操作快速,无论如何。

尝试使用静态数据加载控件(已经预先加载到手机应用程序中)以查看其是否有负载,或者屏幕的加载,例如划分征服类型的分析。

答案 1 :(得分:0)

我不确定我所说的是对的 - 但仅仅是为了它

您是否从互联网上获取商品并将其添加到longlistselector绑定到的可观察集合中?你使用“await”关键字?可能是OnNavigatedTo()方法中的一些重处理?

如果是这样,从互联网上获取东西的过程有可能在UI线程中而不是在另一个线程中运行,或者在前台不应该发生的其他任务阻塞CPU - 这意味着应用程序等待处理数据并且CPU被阻止,直到从网络中提取所有数据 - 在此期间应用程序将无响应 - 您可以使用滚动轴,使用appbar等但我认为这些仅限于UI行为 - 它们不起作用