XAML - Windows Phone 8,使用Pivot Control加载缓慢

3

我有一个Windows Phone 8应用程序,我想知道为什么我的主页加载非常缓慢。

我的主页结构如下:

    <PivotControl>
     <PivotItem>           
       <LongListSelector/>
     </PivotItem>  Times 5

   </PivotControl>

我一共有5个PivotItems,每个项目都有自己的API调用以获取项目并显示它们。每个PivotItem首先加载12个元素,然后在用户开始滚动时再加载更多。
我的问题是,是否有人遇到过主页面有大量元素的问题?你做了哪些改进使页面加载更快?我已经减少了我展示的元素数量(之前在每个PivotItem中加载了40个元素)。
编辑: 我的ListItemTemplate非常干净(我已经清理过它以使XAML代码更轻),它有一个包含InvokeCommandAction的Grid,一个图像,一个边框和3个TextBlocks。
编辑2: 通过在用户不在我的PivotItem上时折叠不同的LongListSelector,我已经在加载时间上获得了约30%的提升,因此我正在隐藏2个LongListSelector。我在中间显示右侧的PivotItem(当然),并在左侧,当用户向左或向右滑动时重新加载和隐藏必要的元素。虽然不太美观但很有用。
编辑3: 几乎(90%)所有样式都已放置在我的StylePage中,并被调用来为我的元素设置样式。我发现在用户进入和离开页面时添加一点动画可以让页面之间的转换更加平滑。这是我的经典转换代码:
<toolkit:TransitionService.NavigationInTransition>
        <toolkit:NavigationInTransition>
            <toolkit:NavigationInTransition.Backward>
                <toolkit:TurnstileTransition Mode="BackwardIn" />
            </toolkit:NavigationInTransition.Backward>
            <toolkit:NavigationInTransition.Forward>
                <toolkit:TurnstileTransition Mode="ForwardIn" />
            </toolkit:NavigationInTransition.Forward>
        </toolkit:NavigationInTransition>
    </toolkit:TransitionService.NavigationInTransition>
    <toolkit:TransitionService.NavigationOutTransition>
        <toolkit:NavigationOutTransition>
            <toolkit:NavigationOutTransition.Backward>
                <toolkit:TurnstileTransition Mode="BackwardOut" />
            </toolkit:NavigationOutTransition.Backward>
            <toolkit:NavigationOutTransition.Forward>
                <toolkit:TurnstileTransition Mode="ForwardOut" />
            </toolkit:NavigationOutTransition.Forward>
        </toolkit:NavigationOutTransition>
    </toolkit:TransitionService.NavigationOutTransition>

使用分析器 http://msdn.microsoft.com/library/windows/apps/hh202934(v=vs.105).aspx如果您提供 ListItemTemplate,也许我可以帮助简化它。 - ad1Dima
2个回答

2

我发现你的问题中没有提到以下两点,但我认为这些会对你有所帮助:

  1. 不要在构造函数或Loaded事件中加载/初始化数据,因为它们与UI控件绑定。这会冻结UI。
  2. 始终对源进行异步调用,这将允许UI在完成任务时继续运行。
  3. 使用OnNavigatedTo(使用缓存数据,如果正在从网络流式传输大量数据),并使用异步方法。

这些应该可以使你的UI恢复正常速度。


0

我猜你在MainPage构造函数中有太多密集的代码。无论如何,您都可以使用Task.Run在不同的线程中加载数据和/或使用MainPage.Loaded事件并在此处完成您的操作。

还要尝试限制您在App.xaml.cs(构造函数、启动方法)中的代码量。

在使用Task.Run时,请不要忘记使用Dispatcher.BeginAction来操作UI。

还有一个Scheduler.Dispatcher.Schedule()方法可用于延迟调用方法。


2
C#已经在单独的线程中加载了,问题在于XAML代码需要很长时间才能加载完成,这主要是因为我一次性加载了太多元素。 - Damien
你能展示一下你的XAML吗?如果你要进行大量的样式设计,考虑创建样式而不是重复定义。我最近就是通过这种方式优化了我的长XAML,结果它占用的内存减少了一半,并且速度更快了。 - Filip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接