"删除启动时的十字转门导航." 什么?

Qui*_*ncy 7 windows-phone windows-runtime winrt-xaml

以下代码在默认模板中提供,用于创建WP8.1 XAML应用程序.(Universal/WinRT).

这段代码用的是什么?我似乎无法在什么时候得到一个断点rootFrame.ContentTransitions != null.应用程序提供自己的开场动画而不是旋转门可能很酷.就像cortana一样.

在App.xaml.cs中

#if WINDOWS_PHONE_APP
            // Removes the turnstile navigation for startup.
            if (rootFrame.ContentTransitions != null)
            {
                _transitions = new TransitionCollection();
                foreach (var c in rootFrame.ContentTransitions)
                {
                    _transitions.Add(c);
                }
            }

            rootFrame.ContentTransitions = null;
            rootFrame.Navigated += this.RootFrame_FirstNavigated;
#endif
Run Code Online (Sandbox Code Playgroud)

编辑:我发现的一条线索 - 如果以上所有代码都被注释掉,那么旋转门页面转换无处不在.现在,如果只有你取消注释:rootFrame.ContentTransitions = null;那么所有的旋转页面转换都会被取消.这很奇怪,因为ContentTransitions在setter之前为null,但如果setter设置为null,则转换是不同的.

编辑编辑:由于OS竞争条件,似乎需要此代码.如果所有代码都被注释掉,除了在极少数情况下将ContentTransitions归零,该应用程序具有十字转门动画.

Jus*_* XL 4

更新(2014 年 12 月 3 日)

我刚刚发现了一种在应用程序第一次加载时使用动画“隐藏”操作系统级别旋转栅门的方法。

要实现这一目标需要三件事——

  1. 该应用程序没有启动图像。
  2. ContentTransitionsnull在主页的处理程序中设置为NavigatedTo
  3. 创建PageIn动画并对主页的LayoutRoot背景颜色进行动画处理 - 基本上是首先使其与系统背景颜色对齐,然后在短时间内将其动画处理为您想要的任何颜色。

您可以从此处下载示例。


如果你把所有代码都注释掉了。你会认为应该ContentTransitions 仍然null正确的吗?至少我是这么认为的。

答案是。稍后将ContentTransitions被分配一个NavigationThemeTransition.

这可能是因为在默认Frame样式中,有这些代码行。

<Setter Property="ContentTransitions">
    <Setter.Value>
        <TransitionCollection>
            <NavigationThemeTransition/>
        </TransitionCollection>
    </Setter.Value>
</Setter>
Run Code Online (Sandbox Code Playgroud)

然而,这个属性Frame只有很晚才被设置。如果您在MainPage. 你会看到它静止不动null。但是,如果您在 中放置另一个断点OnNavigatedTo,最后您将看到this.Framethis.Frame.ContentTransitions以及其中的值。

如果我取消注释怎么办

rootFrame.ContentTransitions = null;
Run Code Online (Sandbox Code Playgroud)

我想,在这个属性的设置器中,没有if (_contentTransitions != null) return;检查,当您将其设置为 时null,一定有什么东西阻止它获得默认值NavigationThemeTransition,这就是为什么您不再看到十字转门动画的原因。

然而,无论您做什么,您仍然会看到一种动画。

尝试按返回键或主页键暂停您的应用程序,然后重新激活它。是的,十字转门动画又回来了!虽然我认为这个十字转门动画与我们Frame.ContentTransitions. 看一下应用程序首次启动的方式 - 闪屏和十字转门动画一起出现。我相信,这是同一个,它可能是由操作系统控制的。

那么,他们为什么要存这张支票呢?

if (rootFrame.ContentTransitions != null)
Run Code Online (Sandbox Code Playgroud)

我的猜测是因为由于存在操作系统级别的旋转栅门动画,如果您不提供启动屏幕,操作系统将简单地为您的应用程序启动设置动画,因此跳过Frame.ContentTransitions.

你可能会问,但Frame.ContentTransitions总是如此null

这是一种情况,但事实并非如此null。尝试使用Frame一些默认值创建自定义ContentTransitions样式,而不是

rootFrame = new Frame(); 
Run Code Online (Sandbox Code Playgroud)

rootFrame = new Frame { Style = (Style)App.Current.Resources["MyFrame"] };
Run Code Online (Sandbox Code Playgroud)

这次,您将看到代码进入if语句中,因为ContentTransitionsis 不再是null