“删除启动时的十字转门导航。”什么?

时间:2014-05-06 21:15:19

标签: windows-runtime windows-phone 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

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

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

2 个答案:

答案 0 :(得分:4)

更新(2014年12月3日)

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

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

  1. 该应用没有启动图像。
  2. ContentTransitions在主页null处理程序中设置为NavigatedTo
  3. 创建一个PageIn动画并为主页的LayoutRoot背景颜色设置动画 - 基本上首先将其与系统背景颜色对齐,然后将其动画为您想要的任意颜色时间。
  4. 您可以从here下载样本。


    如果您已将所有代码注释掉。您会认为ContentTransitions 应该仍然是null吗?至少那是我的想法。

    答案是。稍后会为ContentTransitions分配NavigationThemeTransition

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

    <Setter Property="ContentTransitions">
        <Setter.Value>
            <TransitionCollection>
                <NavigationThemeTransition/>
            </TransitionCollection>
        </Setter.Value>
    </Setter>
    

    但是,Frame的此属性只能设置得很晚。如果在MainPage的构造函数中放置断点。你会看到它仍然是null。但是如果你在OnNavigatedTo中添加另一个断点,最后你会看到this.Framethis.Frame.ContentTransitions都包含值。

    如果我取消注释

    该怎么办?
    rootFrame.ContentTransitions = null;
    

    我想,在此属性的setter中,没有if (_contentTransitions != null) return;检查,当您将其设置为null时,必须有一些东西阻止它获取默认NavigationThemeTransition,这就是为什么你再也看不到旋转门的动画了。

    然而,无论你做什么,你总会看到一个动画

    尝试按返回主页键暂停您的应用,然后重新激活它。是的,旋转门动画又回来了!虽然我认为这个旋转动画与我们在Frame.ContentTransitions禁用的动画不同。看看应用程序是如何第一次启动的 - 一个启动旋转门动画的闪屏。我相信这是同一个,它可能由操作系统控制。

    那么,他们为什么要进行这项检查?

    if (rootFrame.ContentTransitions != null)
    

    我的猜测是因为因为有一个操作系统级别的旋转动画,如果你没有提供启动画面,操作系统只会动画你的应用程序启动,所以跳过Frame.ContentTransitions内的任何内容都是有意义的。 / p>

    您可能会问,但Frame.ContentTransitions始终是null

    这是一个不会是null的情景。尝试使用默认Frame创建自定义ContentTransitions样式,而不是

    rootFrame = new Frame(); 
    

    DO

    rootFrame = new Frame { Style = (Style)App.Current.Resources["MyFrame"] };
    

    这次,当if不再是ContentTransitions时,您会看到代码进入null语句。

答案 1 :(得分:3)

删除rootFrame.Navigated += this.RootFrame_FirstNavigated;

并替换rootFrame.ContentTransitions = null;

rootFrame.ContentTransitions = new TransitionCollection();

指定每个页面使用的转换:

<Page.Transitions>
    <TransitionCollection>
        <NavigationThemeTransition />
    </TransitionCollection>
</Page.Transitions>