是什么阻止了两个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提供的“基本页面

我在我的c++/cx XAML应用程序中遇到了一个非常奇怪的错误: 我有一个后退按钮,检查你的进度是否保存,如果没有保存,会弹出一个弹出按钮,让你保存或不保存就离开。这在两种情况下都是通过
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(不可见按钮)