关于 silverlight:Windows Phone 7 页面转换性能不佳(卡顿)

Bad performance (stuttering) with Windows Phone 7 Page Transitions

我尝试使用 Toolkit 进行页面转换,但所有动画都卡顿了。在另一个问题中,有人建议我不要使用工具包,所以我自己实现了所有动画并手动触发它们。例如导航到另一个页面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void list_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ListBox listBox = sender as ListBox;
    if (null == listBox) return;
    Data.Category item = listBox.SelectedItem as Data.Category;
    if (null == item) return;

    Uri uri = new Uri(App.MakeResourcePathTo(item.Page), UriKind.Relative);

    Storyboard storyboard = Application.Current.Resources["FlipForwardOut"] as Storyboard;
    Storyboard.SetTarget(storyboard, LayoutRoot);
    EventHandler completedHandler = delegate { };
    completedHandler = delegate
            {
                NavigationService.Navigate(uri);

                storyboard.Stop();
                storyboard.Completed -= completedHandler;
            };
    storyboard.Completed += completedHandler;
    storyboard.Begin();

    listBox.SelectedIndex = -1;
}

代码正常吗?
据我了解,不应该有其他任何东西与该代码并行运行。这正是我想要的,因为这样就不会干扰我的动画并使其变慢。

这是另一个代码片段。这显示了我如何处理后退动画。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
    e.Cancel = true;
    Storyboard storyboard = Application.Current.Resources["FlipBackwardOut"] as Storyboard;
    Storyboard.SetTarget(storyboard, LayoutRoot);
    EventHandler completedHandler = delegate { };
    completedHandler = delegate
    {
        storyboard.Stop();
        storyboard.Completed -= completedHandler;

        NavigationService.GoBack();
    };
    storyboard.Completed += completedHandler;
    storyboard.Begin();
}

该代码有什么问题,可能导致性能问题吗?

动画很简单,只有线性动画:

1
2
3
4
5
6
7
8
9
10
<Storyboard x:Key="FlipForwardOut">
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationY)">
        <LinearDoubleKeyFrame KeyTime="0" Value="0"/>
        <LinearDoubleKeyFrame KeyTime="0:0:0.4" Value="70"/>
    </DoubleAnimationUsingKeyFrames>
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)">
        <LinearDoubleKeyFrame KeyTime="0" Value="1"/>
        <LinearDoubleKeyFrame KeyTime="0:0:0.4" Value="0.1"/>
    </DoubleAnimationUsingKeyFrames>
</Storyboard>

我已经认识到一件事:当我导航到全景页面时,全景页面的动画与我的页面转换动画并行运行。全景页面的内置动画让标题滑入,全景项目也滑入到位。因此,有一些平移动画与我的页面转换(基本上是旋转和不透明度)平行运行。
我能否以某种方式阻止全景图播放它自己的动画,或者将它们延迟到我的页面过渡动画完成为止?

我的页面过渡还有一个问题:当我导航到另一个页面并播放动画时,当动画完成时(LayoutRoot 已旋转到 Y=70,并且它的 opacity=0)然后原来的布局显示几毫秒(LayoutRoot 旋转 Y=0 和 opacity=1),然后导航到下一页并开始下一页上的动画。
这是为什么呢?

我希望,有人可以帮助我。
在花了这么多小时后,我感到非常沮丧。无论我尝试了什么,动画都表现不佳,它们在模拟器和设备上都卡顿了。
手机预装应用的动画动画流畅。我不明白这一点。 :(


您的动画代码看起来没问题,尽管您可能没有处理许多场景,所以您可能想看看 Kevin Marshall 的 Page Transitions Sample(我已经发现比 Toolkit 转换执行得更好)。
但是,假设您的动画代码很好,并且您在使用工具包转换时遇到了类似的卡顿,您是否在页面的构造函数中做任何事情?在构造函数中加载和/或处理视图模型或数据是很常见的,这将导致动画延迟,因为这是在 UI 线程上完成的。您应该尽可能多地进行初始化,直到您的页面被 OnNavigatedTo 覆盖。