如何在从辅助磁贴导航到页面时管理后台堆栈

时间:2012-08-15 19:55:12

标签: c# windows-phone-7

我已在我的应用程序中实现了辅助磁贴,因此用户可以将辅助磁贴固定到开始屏幕,然后相应地导航到我的应用程序中的相应页面。这个实现工作正常,除了当用户从固定的辅助磁贴导航到特定页面后点击后面的硬件按钮时,没有任何反应?事实上,尽管用户来自开始屏幕,但实际上会快速显示应用程序中的上一页。什么是实际返回到开始屏幕的正确方法,因为用户期望会发生(我假设这将是正确的后栈导航)?

我所拥有的内容如下,但仅适用于常规页面导航场景,而不适用于用户从开始屏幕固定磁贴导航到SharePage的情况。

MainPage.xaml.cs中

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

        string _title = null;
        NavigationContext.QueryString.TryGetValue("Param", out _title);

        if (_title != null)
        {
            switch (_title)
            {
                case "status":
                    this.NavigationService.Navigate(new Uri("/Views/ShareStatusPage.xaml", UriKind.Relative));
                    break;
                case "link":
                    this.NavigationService.Navigate(new Uri("/Views/ShareLinkPage.xaml", UriKind.Relative));
                    break;
            }
        }            
    }

private void CreateLiveTile(TileItem item)
    {
        string tileParameter = "Param=" + item.Title.ToString();

        ShellTile Tile = CheckIfTileExist(tileParameter);  // Check if Tile's title has been used 

        if (Tile == null)
        {
            try
            {
                var LiveTile = new StandardTileData
                {
                    Title = item.TileName,
                    //BackgroundImage = ((System.Windows.Media.Imaging.BitmapImage)hubtile.Source).UriSource,
                    BackgroundImage = new Uri(item.ImageUri.ToString(), UriKind.Relative),
                    //Count = 1,
                    BackTitle = item.TileName,
                    //BackBackgroundImage = new Uri("", UriKind.Relative),
                    BackContent = item.Message,
                };

                ShellTile.Create(new Uri("/MainPage.xaml?" + tileParameter, UriKind.Relative), LiveTile);  //pass the tile parameter as the QueryString

            }
            catch (Exception)
            {
                MessageBox.Show("This tile could not be pinned", "Warning", MessageBoxButton.OK);
            }
        }
        else
        {
            MessageBox.Show("This tile has already been pinned", "Notice", MessageBoxButton.OK);
        }
    }

private ShellTile CheckIfTileExist(string tileUri)
    {
        ShellTile shellTile = ShellTile.ActiveTiles.FirstOrDefault(tile => tile.NavigationUri.ToString().Contains(tileUri));
        return shellTile;
    }

SharePage.xaml.cs

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
    {
        base.OnBackKeyPress(e);

        //return to the previous page in the phones back stack?
        if (NavigationService.CanGoBack)
        {
            e.Cancel = true;
            NavigationService.GoBack();
        }
        //else
        //{
        //    ??
        //}
    }

到目前为止,CreateLiveTile()方法创建了辅助磁贴,然后在按下该磁贴时,导航到MainPage,然后在MainPage OnNavigatedTo事件中检查查询字符串,然后根据辅助页面加载相应的页面瓷砖被点击了。执行此操作并加载相应的页面后,我无法再按后退按钮返回到开始屏幕以遵循标准的后台堆栈行为。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:0)

否则您可以使用NavigationService.Navigate(homepageUri)

答案 1 :(得分:0)

为什么取消导航?只需删除OnBackKeyPress即可。在这种情况下你不需要它。

答案 2 :(得分:0)

创建一个变量来跟踪主页导航是否来自通过辅助磁贴的导航。在MainPage.Load上检查该变量,如果变量通过辅助磁贴,则从后堆栈中删除前一页。从主页面返回到开始菜单是有意义的,而不是通过辅助磁贴页面返回。这就是MyStocks Portfolio的原因(不,不是我的应用程序之一,而是我的

这是一个关于后退按钮使用的好博客: http://blogs.msdn.com/b/ptorr/archive/2011/10/06/back-means-back-not-forwards-not-sideways-but-back.aspx

答案 3 :(得分:0)

根据您的新更新,我们来看看这个方法:

private void CreateLiveTile(TileItem item)
{
    string tileParameter = "Param=" + item.Title.ToString();
     //...

    if (Tile == null)
    {
        try
        {
            var LiveTile = new StandardTileData
            {
              //...
            };

            ShellTile.Create(new Uri("/MainPage.xaml?" + tileParameter, UriKind.Relative), LiveTile);  //pass the tile parameter as the QueryString

          //blah-blah-blah
}

在此处创建新磁贴并将tileParameter传递给MainPage。因此,您导航到主页面,然后检测tile参数中的文本,并导航到ShareLinkShareStatus页面。这就是为什么你有一个脏的导航堆栈。

让我建议你一种避免这种情况的方法:

private void CreateLiveTile(TileItem item)
    {

    var title =  item.Title.ToString();
     //...

    if (Tile == null)
    {
        try
        {
            var LiveTile = new StandardTileData
            {
              //...
            };
             string page;
        switch (title)
        {
            case "status":
                page = "/Views/ShareStatusPage.xaml";
                break;
            case "link":
                page = "/Views/ShareLinkPage.xaml");
                break;
        }                
        if(string.IsNullOrEmpty(page))
         { 
             //handle this situation. for example: page = "/MainPage.xaml";
         }
            ShellTile.Create(new Uri(page, UriKind.Relative), LiveTile); 

          //blah-blah-blah
}

当用户点击辅助磁贴时,他将直接导航到ShareLinkShareStatus页面。一个NavigationStack将是干净的。当用户按下Back按钮时,应用程序将关闭,用户将看到一个开始屏幕(这是辅助磁贴的右后退按钮行为)。

P.S。不要忘记启动所有服务或加载所有资源(如果有的话)。因为MainPage不会被创建!无论如何,您的应用程序的每个页面都必须能够初始化整个应用程序,因为您必须支持从tombstoned state恢复。

如果需要,请随时询问详细信息。