处理从辅助磁贴启动时的后退按钮

时间:2015-07-18 21:56:11

标签: windows-phone-8.1

当我的应用程序从辅助磁贴启动时(即深层链接),如何使硬件返回按钮返回到系统的“开始”页面?

顺便说一句,我使用的是XAML和C#。

2 个答案:

答案 0 :(得分:0)

如果从辅助磁贴启动应用,则可以清除后台堆栈。

然后按下后退按钮将用户带回“开始”屏幕。

编辑:

清除后台:

如果您在页面代码后面,请执行

UploadedFile

否则做

UploadedFile"

答案 1 :(得分:0)

所以,几个月后终于回答了我自己的问题......

情况

每当我的应用程序使用辅助磁贴启动时,我必须通过调用rootFrame.BackStack.Clear()上的App.xaml.cs来确保后备堆栈已清除。这是必要的,因为如果我的应用程序在内存中有一个暂停的实例,那么从辅助磁贴的这个导航将被添加到暂停实例所具有的任何后备堆栈的顶部。这是一个问题,因为它按下后退按钮返回到堆栈上的上一页而不是“开始”屏幕,这是辅助磁贴启动的适当行为。

问题

如果用户使用辅助磁贴“冷启动”应用,则每当他/她离开时,Windows将使用清除后备栈暂停该应用的会话。这意味着主要磁贴的新启动将恢复从辅助磁贴调用的页面,按后退按钮将再次暂停应用程序,而不是转到应用程序的主页面。

解决方案

它实际上由Microsoft记录,但仅以文本方式(https://msdn.microsoft.com/en-us/library/windows/apps/xaml/dn639128.aspx):

  

当您的应用支持多个启动点时,请确保正确的“后退”按钮行为

     

考虑为发布点创建新的导航日志实例,例如主要和次要图块,文件和URI关联。每次启动应用程序时保存激活参数,并比较重新启动应用程序的时间。如果使用不同参数重新启动应用,请考虑创建新的导航历史记录。通过创建一个新框架来完成此操作。这将允许用户在按下硬件后退键按钮时快速导航回启动点。为了保持较小的内存占用量,当应用程序暂停时,不需要保存除主要磁贴之外的启动点的导航历史记录。

在实践中,对我来说,这意味着将最后收到的启动参数写入应用程序存储中的文本文件,然后在OnLaunched App.xaml.cs方法的开头读取它。然后我将读取值与当前的启动参数进行比较。如果它们不同,我只需将null分配给rootFrame变量,以便创建新的“导航日记帐”:

    protected override async void OnLaunched(LaunchActivatedEventArgs e)
    {
        ...
        Frame rootFrame = Window.Current.Content as Frame;
        var lastArgument = await ReadLastArgument();
        if (!string.Equals(lastArgument,currentArgument))
            rootFrame = null;

        // Do not repeat app initialization when the Window already has content,
        // just ensure that the window is active.
        if (rootFrame == null){
        ...
        }
        ...
        if (!String.IsNullOrEmpty(e.Arguments))
        {
            WriteLastArgument(e.Arguments);
            //Navigate to the page...
            ...
            rootFrame.BackStack.Clear();
        }

    private async Task<string> ReadLastArgument()
    {
        StorageFolder folder = Windows.Storage.ApplicationData.Current.LocalFolder;
        try
        {
            StorageFile file = await folder.GetFileAsync("lastArgument.txt");
            var argument = await Windows.Storage.FileIO.ReadTextAsync(file);
            return argument;
        }
        catch (System.IO.FileNotFoundException)
        {
            return "";
        }

    }

    private async void WriteLastArgument(string argument)
    {
        StorageFolder folder = Windows.Storage.ApplicationData.Current.LocalFolder;
        StorageFile file = await folder.CreateFileAsync("lastArgument.txt", CreationCollisionOption.ReplaceExisting);
        await FileIO.WriteTextAsync(file, argument);
    }
}