C# 导航到新页面将删除回退

C# 导航到新页面将删除回退,c#,windows,mvvm,windows-phone,windows-phone-8.1,C#,Windows,Mvvm,Windows Phone,Windows Phone 8.1,我有一个奇怪的反复出现的问题。有时它消失了,有时又回来了。我无法准确指出所有问题,我的所有断点似乎都按预期顺序命中 当我导航到一个新页面时,我的backbackback会不断被删除,所以按下back只会删除应用程序。显然这是个问题 我认为这可能是我的页面和视图模型结构更复杂的结果。我为页面的所有NavigationHelper内容创建了一个新类,强制使我的所有页面都从新类派生。我强制我的所有页面都连接到一个基本PageViewModel类,以解决两者之间的通信(我有一个更好的方法,但Xaml不能

我有一个奇怪的反复出现的问题。有时它消失了,有时又回来了。我无法准确指出所有问题,我的所有断点似乎都按预期顺序命中

当我导航到一个新页面时,我的backbackback会不断被删除,所以按下back只会删除应用程序。显然这是个问题

我认为这可能是我的页面和视图模型结构更复杂的结果。我为页面的所有NavigationHelper内容创建了一个新类,强制使我的所有页面都从新类派生。我强制我的所有页面都连接到一个基本PageViewModel类,以解决两者之间的通信(我有一个更好的方法,但Xaml不能很好地发挥作用),并且我使用导航服务进行导航,在导航服务中我调用CurrentFrame,这是一个静态方法,用于
返回Windows.Current.Content as Frame

以下是我认为相关的代码。有什么想法吗?先谢谢你。我不知道发生了什么事:/

我使用NavigationService中的navigate方法(不是其他两个lolol)向前导航,但我的后退按钮不能正确返回





第二个依赖于
Windows.Phone
程序集。该程序集存在于WP8应用程序中,但不适用于通用应用程序类库。这意味着,即使我将WINDOWS\u PHONE\u应用程序宏添加到库中,应用程序也不会编译。您不能在通用应用程序类库中使用Windows Phone 8/8.1项目生成的NavigationHelper。我会尝试提出这个问题。谢谢

更新[已解决]:

该错误是由使用通用应用程序类库引起的

我想将NavigationHelper.cs类(在WP8应用程序中默认生成)分离到一个库中。因此,我可以直接对VM进行单元测试(我无法在单元测试项目中引用WP8应用程序)。因此,我将NavigationHelper.cs类以及上面的所有相关代码放在一个新的通用应用程序类库中

NavigationHelper类依赖于两件事,构建中的
WINDOWS\u PHONE\u APP
宏,它影响NavigationHelper类中的这个特定部分,即HardwareButton BackPressed listener

#if WINDOWS_PHONE_APP
            Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;
#else
#if WINDOWS_PHONE_APP
            Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;
#else
    ...
#endif
因为宏没有定义,所以“后退”按钮实际上不会返回


第二个问题是缺少
Windows.Phone
程序集。该程序集存在于WP8应用程序中,但不适用于通用应用程序类库。这意味着,即使我向库中添加
WINDOWS\u PHONE\u应用程序
宏,该应用程序也不会编译。您不能在通用应用程序类库中使用Windows Phone 8/8.1项目生成的NavigationHelper。我会尝试提出这个问题。谢谢

您可以将NavigationHelper留在共享项目中,只需将其添加到Windows Phone项目的主页中即可

 static MainPage()
        {
            HardwareButtons.BackPressed += (sender, args) =>
            {
                var frame = Window.Current.Content as Frame;
                if (frame != null && frame.CanGoBack)
                {
                    frame.GoBack();
                    args.Handled = true;
                }
            };
        }

这解决了我的BackButton问题。

您在哪里订阅硬件?您正在执行Frame.GoBack()或类似的操作吗?可能是后退了,但你没有导航回来?我按硬件后退按钮后退。我不订阅被压回的硬件。我做了一系列恢复,似乎打破了堆栈的更改是在我将viewmodels/navigationhelper/services移动到一个单独的库项目时。我不明白为什么会这样,但我正在调查。我已经能够缩小范围,将默认的NavigationHelper移动到我的库中。如果NavigationHelper.cs与WP8应用程序在同一个项目中,我就可以了。如果它在另一个库项目中,我不能向后导航。调试时将更新更多。请尽量缩小代码范围。可能您可以与该问题共享一个简单的编译项目。啊,我发现了错误,感谢您的帮助调试:)“您不能在通用应用程序类库中使用Windows Phone 8/8.1项目生成的NavigationHelper。”-实际上你可以-也可以使用
#ifdef WINDOWS\u PHONE\u应用程序中的
指令包装
(我也在Universal应用程序中使用)。不,那不是真的。问题不在于
使用
指令。问题是,默认情况下,编译符号
WINDOWS\u PHONE\u APP
WINDOWS\u APP
不会加载到大学应用程序类库中。这意味着任何依赖于这些符号的代码将永远不会运行。对我来说是有效的-而且,标准的通用应用程序模板已经使用了App.cs中的那些符号。App.cs在一个特殊的共享项目中。编译项目时,共享项目将其代码复制到关联的Windows和Windows Phone项目。因为代码是直接复制的,所以编译符号可以正确应用。共享项目不是通用应用程序类库。他们可能在VS Update 4中进行了更改,但据我所知,共享项目不是一个通用库。
#if WINDOWS_PHONE_APP
            Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;
#else
#if WINDOWS_PHONE_APP
            Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;
#else
    ...
#endif
 static MainPage()
        {
            HardwareButtons.BackPressed += (sender, args) =>
            {
                var frame = Window.Current.Content as Frame;
                if (frame != null && frame.CanGoBack)
                {
                    frame.GoBack();
                    args.Handled = true;
                }
            };
        }