优化Pivot Control windows phone 8

时间:2014-09-20 05:01:20

标签: windows-phone-7 windows-phone-8 windows-phone windows-phone-7.1 windows-phone-8.1

案例1:

我有一个带有3个数据透视项目的数据透视控件,每次数据透视项目首次获得焦点时,都会填充数据(来自服务器)。

现在,当我从其他页面导航到此Pivot页面时,会造成很多延迟。如何优化它并减少延迟?导航回此页面时,即使我无法显示ProgressBar。

案例2:

我有一个包含更多项目的ListView,例如150,在选择项目时我需要显示selectedItem的详细描述,它应该是可刷的,以便用户可以在同一描述页面中看到下一条记录。 / p>

现在,我正在使用Pivot页面并将项目绑定到ItemsSource属性,并且在导航到数据透视页面和从数据透视页面导航时会产生更多延迟(10秒)。

如何摆脱这种延迟?

帮帮我。感谢。

1 个答案:

答案 0 :(得分:0)

在第一页上使用LongListSelector(WP8)或ListView(WP8.1)作为项目持有者。它具有UI虚拟化,因此无论页面上有多少项目,都只会呈现屏幕上的项目。它必须解决您的case 1延迟。如果没有 - 问题是在第2页中破坏。

你的细节屏幕方法是完全错误的。 Pivot是为其他目的而创建的,不建议在其中容纳超过5个项目。

所以你需要:

  1. 创建用于显示一个项目的页面,并将DataContext绑定到LayoutRoot
  2. ManipulationCompleted事件处理程序添加到LayoutRoot并检查是否存在滑动
  3. DataContext更新为上一个或下一个项目。这将更新屏幕上显示的数据
  4. 当此方法有效时,创建动画以平滑当前页面向左和向右的过渡:
    • 当用户在手机上移动手指时 - 将页面左右移动到相同的偏移量
    • 当用户离开手指 - 调用动画以完成滑动
    • 当动画完成时(屏幕上方的页面),更新DataContext并调用动画以从屏幕的另一侧带来新项目
  5. 这将复制Pivot行为,但不可见项目的内存消耗

    <强> UPD:

    第4步实施:

    private void LayoutRoot_ManipulationDelta(object sender, System.Windows.Input.ManipulationDeltaEventArgs e)
    {
        (LayoutRoot.RenderTransform as CompositeTransform).TranslateX += e.DeltaManipulation.Translation.X;
    }
    
    private void LayoutRoot_ManipulationCompleted(object sender, System.Windows.Input.ManipulationCompletedEventArgs e)
    {
        if (e.TotalManipulation.Translation.X + e.FinalVelocities.LinearVelocity.X < -100)
        {
            if (current < Count - 1)
            {
                //slide to next item
                current++;
            }
            else
            {
                //no next item - slide back
            }
        }
        else if (e.TotalManipulation.Translation.X + e.FinalVelocities.LinearVelocity.X > 100)
        {
            if (current > 0)
            {
                // slide to prev item
    
                current--;
            }
            else
            {
                // no prev item - slide back
            }
        }
        else
        {
            // no swipe - slide back
        }
    }