应用程序中的导航已激活Windows Phone 7(逻辑删除)

时间:2010-10-12 01:20:49

标签: c# silverlight windows-phone-7

每当我的程序通过墓碑关闭时,当它被重新激活时,我希望应用程序导航回到开始屏幕。

我想做这样的事情

private void Application_Activated(object sender, ActivatedEventArgs e) { NavigationService.Navigate(new Uri("/Start.xaml", UriKind.Relative));
}

但它不起作用。谢谢,舒尔曼。

5 个答案:

答案 0 :(得分:5)

这不是墓碑下普遍接受的行为。期望应用程序应该完全按照用户离开时的方式返回。请记住,墓碑可能是应用程序中用户启动的操作之外的其他内容的结果。例如,作为用户,我不希望应用程序忘记我输入的所有信息并返回上一个屏幕,因为我接听了电话。

如果你真的想这样做,它的完成方式取决于应用程序的结构和导航层次结构。

您最好的选择可能是建立自己的导航系统 如果你想使用内置的后台堆栈。您的Application_Activated事件可以设置一个全局标记,所有页面将在其OnNavigatedTo事件中获取,然后通过向后导航进行响应。这种向后导航可能对用户可见(如果只是短暂的),并且创建的体验不太理想。

<强>更新
现在可以使用Non-Linear Navigation Service进行类似的操作。

答案 1 :(得分:2)

我是第二个Matt,这不是MSFT指南推荐的行为。 WP7用户希望该应用程序能够正确地进行坟墓投掷。

如果您仍然严格执行此操作,请执行以下操作:在导航时多次使用NavigationService.GoBack()。 从技术上讲,WP7保留了您在系统中已经完成的所有页面转换,您可以编程返回主页。您可能需要等待NavigationCompleted事件然后调用下一个GoBack()并调用它,直到NavigationService.CanGoBack为false,这将是您的主页:)

答案 2 :(得分:2)

不要听所有这些引用指南的gooders 哈欠

试试这个

private void Application_Activated(object sender, ActivatedEventArgs e)
{
    RootFrame.Navigated += RootFrame_Navigated;
}

void RootFrame_Navigated(object sender, NavigationEventArgs e)
{
    RootFrame.Navigated -= RootFrame_Navigated;
    RootFrame.Navigate(new Uri("/TestPage.xaml", UriKind.Relative));
}

答案 3 :(得分:0)

正如@Matt Lacey所说,这几乎肯定是你不应该做的事情:你可能会对市场犯规certification guidelines

  

5.2.3停用后的应用响应

     

Windows Phone应用程序是   当用户按下时停用   开始按钮或设备超时   导致锁定屏幕啮合。一个   Windows Phone应用程序也是   调用启动器时停用   或Chooser API。激活时,   申请发布时间必须符合   第5.2.1节中的要求。

     

Microsoft建议应用程序重新建立状态   用户的应用程序   在申请之前经历过   停用即可。欲获得更多信息,   请参阅执行模型概述   Windows Phone主题。

你在做什么样的申请?在不知道更多关于它或程序的上下文的情况下,很难调用返回到开始屏幕是否合适。

答案 4 :(得分:0)

我们遇到了转换大型遗留项目的同样问题,需要对tomstoning采取一些自由。我们都对这个平台比较陌生,所以请大家多听一下这个建议。我们的启动页面是SplashPage.xaml。我们使用UriMapper从最后一个当前源重定向:

    private void Application_Activated(object sender, ActivatedEventArgs e) {
        IsTombstoned = ! e.IsApplicationInstancePreserved;

        if (IsTombstoned) {
            //the os wants to return to the last page, but we want it to restart to our splash page 
            RootFrame.UriMapper = new RestartUriMapper();
        }
    }

这会重定向到SplashPage.xaml,然后我们会进行另一次导航以清除操作系统想要访问的最后一页(可能是导航实现所独有的。)

    protected override void OnNavigatedTo(NavigationEventArgs e) {
        base.OnNavigatedTo(e);

        if (NavigationContext.QueryString.ContainsKey("restart")) {
            var app = Application.Current as App;
            //a page redirect mapper was installed to get here from tombstone - reinstate the AssociationUriMapper now
            app.RootFrame.UriMapper = App.Root.AssociationUriMapper;

            //from tombstone, the last current nav source is still state, so force an initial navigation back to 
            //a new instance of this splash page and proceed start up from there
            App.PageNavigation.Navigate(@"/Pages/SplashPage.xaml?fromtomb=true");
        }
    }


class RestartUriMapper : UriMapperBase {
    Uri restartUri;

    public RestartUriMapper() {
        restartUri = new Uri(string.Format("/Pages/SplashPage.xaml?restart={0}", true.ToString()), UriKind.Relative);
    }

    public override Uri MapUri(Uri uri) {
        if (restartUri != null) {
            Uri nextPageUri = restartUri;
            restartUri = null;
            return nextPageUri;
        }

        return uri;
    }
}