是什么阻止了两个XAML页面之间的导航?
我在我的c++/cx XAML应用程序中遇到了一个非常奇怪的错误: 我有一个后退按钮,检查你的进度是否保存,如果没有保存,会弹出一个弹出按钮,让你保存或不保存就离开。这在两种情况下都是通过是什么阻止了两个XAML页面之间的导航?,xaml,microsoft-metro,visual-studio-2013,c++-cx,Xaml,Microsoft Metro,Visual Studio 2013,C++ Cx,我在我的c++/cx XAML应用程序中遇到了一个非常奇怪的错误: 我有一个后退按钮,检查你的进度是否保存,如果没有保存,会弹出一个弹出按钮,让你保存或不保存就离开。这在两种情况下都是通过This->frame->goBack()完成的,但是: 保存进度时,应用程序会在\u debugbreak()处停止。但是,当弹出按钮调用goBack()时,一切正常。为什么可能是这样 可能对你有帮助的事情: 该应用程序基于“空白应用程序”模板,页面本身基于Visual Studio 2013提供的“基本页面
This->frame->goBack()
完成的,但是:
保存进度时,应用程序会在\u debugbreak()
处停止。但是,当弹出按钮调用goBack()
时,一切正常。为什么可能是这样
可能对你有帮助的事情:
该应用程序基于“空白应用程序”模板,页面本身基于Visual Studio 2013提供的“基本页面”模板
BoardPage.xaml中的控件定义如下:
<AppBarButton x:Name="backButton" Icon="Back" Height="95"
Click="backButton_Clicked">
<AppBarButton.Resources>
<Flyout x:Key="WarningFlyoutBase">
<Grid Height="150" Width="200">
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<TextBlock Text="Unsaved progress, what do you want to do?"
HorizontalAlignment="Center" TextWrapping="Wrap"
FontSize="14" Margin="4,10" TextAlignment="Center"/>
<Button x:Name="WarningSaveButton"
Content="Save now."
Grid.Row="1" HorizontalAlignment="Center"
Click="WarningSaveButton_Clicked"/>
<Button x:Name="WarningLeaveButton"
Content="Leave without saving."
Grid.Row="2" HorizontalAlignment="Center"
Click="WarningLeaveButton_Clicked"/>
</Grid>
</Flyout>
</AppBarButton.Resources>
<AppBarButton.Flyout>
<StaticResource ResourceKey="WarningFlyoutBase"/>
</AppBarButton.Flyout>
</AppBarButton>
注意:我还尝试将GoBack()
替换为Navigate(TypeName(CreateGamePage::typeid))
,但没有帮助
警告离开按钮:
void Tackle::BoardPage::backButton_Clicked(Platform::Object^ sender,
Windows::UI::Xaml::RoutedEventArgs^ e)
{
if (saved && Frame->CanGoBack) /* saved is a bool */
this->Frame->GoBack();
else
backButton->Flyout->ShowAt((FrameworkElement^)sender);
}
void Tackle::BoardPage::WarningLeaveButton_Clicked(Platform::Object^ sender,
Windows::UI::Xaml::RoutedEventArgs^ e)
{
if (Frame->CanGoBack)
this->Frame->GoBack();
}
其他奇怪的东西:
在相当长的一段时间内,我试图检查此崩溃/调试中断的原因,并发现以下情况:
- 使用
this->Frame->Navigate(TypeName(BoardPage::typeid),ref new-CGameSession(job))导航到有问题的页面代码>。忽略第二个参数,可以神奇地修复崩溃
- 在
App.g.hpp
中触发断点时,在值errorMessage
reveales上打开一个手表:
“放置目标需要位于可视树中。”
为什么弹出按钮在视觉树中,但它所连接的按钮却不在
- 目标页面实际上是构造的,但是
NavigationHelper->OnNavigatedTo(e)
方法在最后一行LoadState中失败(这里引用新的LoadStateEventArgs(e->Parameter,safe_cast(frameState->Lookup(_pageKey))
,这似乎有点奇怪,因为LoadState()
很容易被调用,并且只包含两个(void)
类型转换。(我没有修改任何一种方法。)
这里的问题在于弹出型按钮和事件处理程序与XAML控件的工作方式,有两点会导致我的代码崩溃:
当单击或轻触其所连接的按钮时,弹出型按钮始终显示
事件处理程序似乎在弹出按钮显示之前执行
由此产生了什么?
嗯,当按下backButton
时,首先会触发单击的backButton
。
未保存游戏时,弹出按钮打开,您可以毫无问题地返回。
但是如果之前保存了游戏,事件处理程序会立即调用this->Frame->GoBack()
,它会做它应该做的事情,构造上一页,加载它的状态并绘制它。
但是之后,它尝试打开弹出型按钮,这就是这里的问题:弹出型按钮不再存在,因此出现奇怪的错误消息
我有点尴尬我花了这么长时间才弄明白,但也许将来有人会发现这很有用,所以我将把这个问题留在这里
解决方法:
我现在使用的解决方法是将弹出式按钮底座移动到
,并将其连接到一个大小为0x0 px的按钮上。触发弹出按钮,然后按如下方式执行:弹出按钮::ShowAttachedFlyout(不可见按钮)代码>