Windows Phone 7关闭应用程序

27

有没有可能以编程方式关闭 Windows Phone 7 上的 Silverlight 应用程序?


1
请阅读此链接:http://blog.jerrynixon.com/2011/11/mango-sample-exit-application.html - Jerry Nixon
这个问题可以通过下面的帖子解决,其中展示了安全退出Silverlight应用程序的代码。 - Syed Umar Ahmed
为什么不允许用户在第一页上按返回键,以便应用程序可以自然退出? - onmyway133
14个回答

14
如果您编写XNA游戏,您将可以访问显式的 Exit()方法。如果您正在编写传统的Silverlight项目,则没有以编程方式关闭应用程序的方法。另请参见Peter Torr在Windows Phone 7中退出Silverlight应用程序的博客文章。在那里,他还提到了抛出未处理的异常选项,我认为这是一种糟糕的编程风格。
您可以尝试的一个选项是使用WP7导航服务以编程方式导航出应用程序。不确定那是否会起作用。为什么您需要“退出”?

请注意,当您在应用程序的第一页时,CanGoBack为false。尝试进一步返回会抛出异常,尽管不太优雅,但最终实现了您的目标。 - Matt Ruwe
有一种编程方法可以在Silverlight应用程序中以编程方式关闭您的应用程序,请参考下面的帖子。 - Syed Umar Ahmed

11

当你在网站的首页,想要通过点击应用程序的返回按钮退出时,可以使用以下代码:

if (NavigationService.CanGoBack)
{
    while (NavigationService.RemoveBackEntry() != null)
    {
        NavigationService.RemoveBackEntry();
    }
}

这将从堆栈中移除后退条目,当你按下后退按钮时,它将无异常地关闭应用程序。


谢谢。在我的应用程序中,页面的流程如下:1 -> 2 -> 3,但第二个页面是一个向导,将您带到第三个页面,在那里我拦截了返回按钮并手动导航到第一页,跳过第二页。但由于导航服务的工作方式,在手动更改页面后,我无法从应用程序返回到操作系统。 - LukeP
1
+1 - 不确定为什么更多人不使用这种方法。它完美地工作,而且没有抛出异常... - David Spence
1
这太棒了,为什么没有人建议这个,对我来说非常有效。 - Nico
1
这是使手机在当前页面后退出应用程序的唯一干净方式。只需在页面加载事件上执行此代码,下次用户按返回键时,应用程序将无异常地终止。 - Roboblob
1
这并不会自动关闭应用程序。用户必须手动按下返回按钮才能关闭应用程序。因此,它并没有回答问题(=>编程方式关闭应用程序),在我看来这意味着“无需用户交互”! - froeschli
显示剩余2条评论

8
银光的简短回答是否定的。您不应该提供关闭应用程序的方法。关闭应用程序应该是用户的选择,并通过使用适当次数的后退按钮来实现。这也是市场要求。话虽如此,如果出现未处理的异常,银光应用程序将关闭。我见过一些人尝试通过抛出明确被错误处理忽略的自定义错误来创建编程关闭。这可能有效,但仍存在市场问题。XNA应用程序可以显式调用Exit()。

Matt在这里是正确的 - 从Silverlight你不能,但你可以从XNA。下面的链接到Peter的博客提供了更多信息。请注意,抛出自定义错误是违反市场政策的行为,将导致应用程序被拒绝市场接受。此外,从Silverlight应用程序调用XNA Exit方法是不允许的。 - Jeff Wilcox

6

这里已经有一些好的信息了。补充一下...

该平台完全能够管理应用程序的关闭。如果越来越多的应用程序不提供退出功能,用户就会更快地习惯于不考虑应用程序的清理工作,并让平台来管理它。

用户只需使用“开始”、“返回”等按钮浏览他们的设备。

如果用户想要退出当前应用程序并快速转到其他操作 - 很容易 - 他们只需点击“开始”。

虽然 XNA 可用 .Exit() 方法,但现在实际上已经不需要了。在 CTP 期间,游戏必须提供一个退出按钮以符合认证要求。但现在这个要求已经取消了。

非游戏应用程序从未有过实现这个功能的需求。

越多人讨论这个话题(实际上已经讨论得很透彻了),我越觉得指示没有必要编写退出代码。

更新:对于那些认为未处理的异常是关闭应用程序或让应用程序由于低劣的操作条件而关闭的合适方法的人,我建议查看此答案中有关应用程序认证要求的评论。有没有一种方法可以编程退出我的应用程序?(Windows Phone 7)


3

这里有另一种解决方案。 如果您有一个显示错误信息给最终用户的错误页面,您可以使用

    protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
    {
        base.OnBackKeyPress(e);
        e.Cancel = true;
    }

您可以指导用户按下启动按钮退出应用程序。


2

添加对Microsoft.Xna.Framework.Game的引用,然后调用:

new Microsoft.Xna.Framework.Game().Exit();

为什么您要尝试添加XNA引用?当它是一个Silver Light应用程序时。 - Syed Umar Ahmed
添加引用不会影响应用程序,如果您需要干净地退出应用程序,则有一个一行代码的选项。 - Patrick Bounaix
使用此 API 用于 Silverlight 应用程序会使应用程序在市场上被拒绝,不是吗? - Apoorva
完全没有问题。考虑到有一个针对Silverlight和XNA的Visual Studio项目,所以应该没有问题。(我已经用我的应用程序进行了验证,我知道其他一些应用程序也是这样做的。) - Patrick Bounaix

1
private void PhoneApplicationPage_BackKeyPress(object sender, System.ComponentModel.CancelEventArgs e)
{
    while (NavigationService.CanGoBack)   
        NavigationService.RemoveBackEntry();
}

对我来说没问题。


1

这在Windows Phone 7上完美运行。

 System.Reflection.Assembly asmb = System.Reflection.Assembly.Load("Microsoft.Xna.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553");
            asmb = System.Reflection.Assembly.Load("Microsoft.Xna.Framework.Game, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553");
            Type type = asmb.GetType("Microsoft.Xna.Framework.Game");
            object obj = type.GetConstructor(new Type[] { }).Invoke(new object[] { });
            type.GetMethod("Exit").Invoke(obj, new object[] { });

链接 - source


1
您可以使用以下语句关闭应用程序:

Application.Current.Terminate();

1
问题是关于Windows Phone 7,而不是Windows Phone 8。 - Olter

0
最简单的做法是添加对 Microsoft.Xna.Framework.Game 的引用,然后在命名空间之前添加using Microsoft.Xna.Framework.GamerServices;。 然后我们在我们的 Example.xaml 中有一个按钮,其代码为 Click="quit_button"。在我们的 Example.xaml.cs 中,我们将此代码放在我们的页面类中:
private void quit_Click(object sender, EventArgs e)
        {
            new Microsoft.Xna.Framework.Game().Exit();
            //This will close our app
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接