1

我想让用户能够将 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 硬件后退按钮认证要求解决此问题(在这种情况下必须返回到开始屏幕)?

4

3 回答 3

1

任务会一遍又一遍地加载,因为每次您返回 taskpage 时,无论导航模式是新的还是返回,都调用 Navigationdto 函数,该函数调用 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 . 
    }
于 2012-10-10T07:08:41.593 回答
0

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

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

于 2012-10-10T04:41:47.947 回答
-1

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

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

    { 

     while (NavigationService.BackStack.Count() >= 1)
                NavigationService.RemoveBackEntry();
     }
于 2012-10-10T07:19:04.947 回答