如何从后台堆栈中删除导航项

时间:2012-10-10 02:07:09

标签: c# windows-phone-7

我希望允许用户将ConnectionSettingsTask项目固定到起始页面,然后通过按“开始”页面上的相应磁贴导航到该特定的ConnectSettingsTask。我的问题是,一旦用户导航到相应的ConnectionSettingsTask页面,用户就无法使用硬件后退按钮直接导航回起始页面。出于某种原因,应用程序一遍又一遍地加载相同的ConnectionSettingsTask页面。我现在的实施如下:

MainPage.xaml.cs中

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

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

        if (_title != null)
        {
            ConnectionSettingsTask connectionSettingsTask = new ConnectionSettingsTask();                

            switch (_title)
            {
                case "WiFi":                        
                    connectionSettingsTask.ConnectionSettingsType = ConnectionSettingsType.WiFi;
                    connectionSettingsTask.Show();
                    break;
                 ...
            }

            try
            {                     
                //NavigationService.RemoveBackEntry();
                //_title = null;
                NavigationContext.QueryString.Remove(_title);
            }
            catch(InvalidOperationException ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }

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

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

        if (Tile == null)
        {
            //choose which original background tile image to use
            switch (title)
            {
                case "WiFi":                        
                        background = new Uri("/Images/Mode/Mode_WiFi.png", UriKind.Relative); 
                    break;
                ...
            }

            try
            {
                var LiveTile = new StandardTileData
                {
                    Title = item.TileName,
                    BackgroundImage = background,
                    BackTitle = item.TileName,
                    //BackBackgroundImage = new Uri("/background.png", UriKind.Relative),
                    BackContent = item.Message,
                };

                ShellTile.Create(new Uri("/View/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;
    }

因此,基本上创建磁贴并将辅助磁贴固定到开始屏幕的工作,以及从辅助磁贴加载WiFI ConnectionSettingsTask。但是当我尝试从ConnectionSettingsTask页面导航回来时,它只是不断重新加载该页面。我如何根据Windows Phone硬件后退按钮认证要求修复此问题(在此方案中必须返回到启动屏幕)?

3 个答案:

答案 0 :(得分:1)

任务一次又一次地加载,因为每次回到任务页面时,都要调用navigatedto函数,该函数调用ConnectionSettingsTask,无论导航模式是新的还是返回模式。

确保您打开任务,当导航模式是新的时,就像代码一样:

        base.OnNavigatedTo(e);
        if (e.NavigationMode == System.Windows.Navigation.NavigationMode.New)
        {
             // Open Task
         }

........................................我之后无法添加我的评论你的:

如果从连接设置任务返回主页,您想要返回起始页吗?

您可以知道最后一页是否是任务页面。

        if (e.NavigationMode == System.Windows.Navigation.NavigationMode.New)
        {
             // Open Task
             _fromTask = true;
         }
        else if(e.NavigationMode==System.Windows.Navigation.NavigationMode.Back&&_fromTask)
    {
    // exit your app . 
    }

答案 1 :(得分:0)

我认为,当您按下后退按钮时,它将返回到您最初导航到的主页面。在主页面中,您有重定向逻辑,因此它再次进入您的ConnectSettingsTask页面

为什么不能为您的辅助磁贴设置ConnectSettingsTask页面URL以及tile参数..我认为它应该可以工作..

答案 2 :(得分:-1)

试试这段代码。通过一些修改,您可以将此代码用于您的场景。

    protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)

    { 

     while (NavigationService.BackStack.Count() >= 1)
                NavigationService.RemoveBackEntry();
     }