0

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

我所拥有的内容如下,但仅适用于正常页面导航场景,而不是当用户从开始屏幕固定磁贴导航到 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 事件中检查查询字符串,然后根据单击的辅助磁贴加载相应的页面。执行此操作并加载相应页面后,我无法再按后退按钮返回开始屏幕以遵循标准的 backstack 行为。我怎样才能解决这个问题?

4

4 回答 4

0

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

于 2012-08-15T20:02:57.683 回答
0

为什么要取消导航?只需删除OnBackKeyPress. 在这种情况下,您不需要它。

于 2012-08-15T20:21:14.250 回答
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

于 2012-08-15T20:32:44.463 回答
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
}

在这里,您创建一个新图块并传递tileParameterMainPage. 因此,您导航到主页,然后检测 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
}

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

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

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

于 2012-08-16T07:49:48.193 回答