Uwp 为什么显示我的ContentDialog的异步/等待代码在运行时失败?

Uwp 为什么显示我的ContentDialog的异步/等待代码在运行时失败?,uwp,async-await,uwp-xaml,contentdialog,Uwp,Async Await,Uwp Xaml,Contentdialog,我想在我的UWP应用程序中实例化ContentDialog,它在我的XAML中定义如下: <Page . . . <Grid x:Name="grd"> . . . <ContentDialog x:Name="cntDlgLoadMap" Title="This is an example" PrimaryButto

我想在我的UWP应用程序中实例化ContentDialog,它在我的XAML中定义如下:

<Page
    . . .
    <Grid x:Name="grd">
        . . .
        <ContentDialog x:Name="cntDlgLoadMap"
            Title="This is an example"
            PrimaryButtonText="Ok"
            CloseButtonText="Cancel"
            DefaultButton="Primary">
        </ContentDialog>
    </Grid>
</Page>
…但得到了此设计时间错误消息:

因此,我将代码更改为这样,将async添加到方法/事件处理程序中,并等待调用以显示内容对话框:

private async void btnLoadMap_Click(object sender, RoutedEventArgs e)
{
    await cntDlgLoadMap.ShowAsync();
}
因此,应用程序会编译并运行,但当我选择LoadMaps按钮时,我会得到以下结果:

然后,在按F5继续后,我得到:

我的代码或XAML有什么问题或遗漏了什么

使现代化 根据Roy Li的请求,以下是加载按钮的XAML:

<Button x:Name="btnLoadMap" Content="Load Map" Margin="20,16,50,0" VerticalAlignment="Top" Click="btnLoadMap_Click" />
    

在堆栈上而不是在页面Xaml上创建ContentDialog。您可以使用xaml创建新的ContentDialog类或UserControl类。请参见示例


我可以使用下面的代码让它几乎/或多或少地工作

以下是相关的XAML:

<Button x:Name="btnCre8NewMap" Content="Create New Map" ToolTipService.ToolTip="Create a new map" Margin="140,16,50,0" VerticalAlignment="Top" Click="btnCre8NewMap_Click"/>
. . .
<ContentDialog x:Name="cntDlgCre8Map"
Title="Create a New Map"
PrimaryButtonText="Save"
CloseButtonText="Cancel"
DefaultButton="Primary">
    <StackPanel>
    <TextBlock Text="Map Name: "/>
    <TextBox x:Name="txtbxMapName"
        Width="300" HorizontalAlignment="Left"/>
    <TextBlock Text="Default Zoom Level: "/>
    <ComboBox x:Name="cmbxCre8MapZoomLevels"
        Width="100" HorizontalAlignment="Left"/>
    <TextBlock Text="Map Notes: "/>
    <TextBox x:Name="txtbxMapNotes"
        Width="300" Height="300" HorizontalAlignment="Left"/>
    </StackPanel>
</ContentDialog>
…下面是代码隐藏中的按钮单击事件:

private async void btnCre8NewMap_Click(object sender, RoutedEventArgs e)
{
    try
    {
        string mapName = string.Empty;
        string mapNotes = string.Empty;
        int defaultZoomLevel = 1;
        ClearLocations();
        // Popul8 the cmbx
        for (int i = 1; i < 20; i++)
        {
            cmbxCre8MapZoomLevels.Items.Add(i.ToString());
        }
        ContentDialogResult result = await cntDlgCre8Map.ShowAsync();

        if (result == ContentDialogResult.Primary)
        {    
            mapName = txtbxMapName.Text;
            mapNotes = txtbxMapNotes.Text;
            defaultZoomLevel = cmbxCre8MapZoomLevels.SelectedIndex + 1;
            InsertMapRecord(mapName, mapNotes, preferredZoomLevel);
        }
        // else do nothing (don't save)
    }
    catch (Exception ex)
    {
        MessageDialog exceptionMsgDlg = new MessageDialog(ex.Message, "btnCre8NewMap_Click");
        await exceptionMsgDlg.ShowAsync();
    }
}
这是我单击btnCre8NewMap时看到的内容:


我无法用您提供的代码重现该问题。你能分享一下关于LoadMaps按钮的xaml代码吗?当然:我更新了我的问题,我不得不说我仍然不能用xaml代码重现这个问题,它在我这边正常工作。顺便问一下,你试过迈克尔的答案吗?我的错;是其他原因造成了这个问题。不过,当抛出异常时,这个err msg会出现,这似乎仍然很奇怪;IOW:WTH?当发生未经处理的异常时,将调用全局未处理异常处理程序。换句话说,你的应用程序正在某个地方抛出异常,但它不在try块中,或者它在没有catch子句的try块中,这是你最后一次做点什么的机会。谢谢;在堆栈上,你的意思是在C代码后面吗?我看了一下这个示例,但通过这个链接还是不太清楚:不要把内容对话框放在页面的xaml上,在你的点击功能中用new创建它,就像我上面展示的那样。对,但是我不确定它的MyUserControl部分。创建一个新的UserControl派生类,该类具有用户控件的Xaml。MyUserControl就是一个例子。我离我需要的地方更近了,但现在有一个不同但相关的问题。请看
<Button x:Name="btnCre8NewMap" Content="Create New Map" ToolTipService.ToolTip="Create a new map" Margin="140,16,50,0" VerticalAlignment="Top" Click="btnCre8NewMap_Click"/>
. . .
<ContentDialog x:Name="cntDlgCre8Map"
Title="Create a New Map"
PrimaryButtonText="Save"
CloseButtonText="Cancel"
DefaultButton="Primary">
    <StackPanel>
    <TextBlock Text="Map Name: "/>
    <TextBox x:Name="txtbxMapName"
        Width="300" HorizontalAlignment="Left"/>
    <TextBlock Text="Default Zoom Level: "/>
    <ComboBox x:Name="cmbxCre8MapZoomLevels"
        Width="100" HorizontalAlignment="Left"/>
    <TextBlock Text="Map Notes: "/>
    <TextBox x:Name="txtbxMapNotes"
        Width="300" Height="300" HorizontalAlignment="Left"/>
    </StackPanel>
</ContentDialog>
private async void btnCre8NewMap_Click(object sender, RoutedEventArgs e)
{
    try
    {
        string mapName = string.Empty;
        string mapNotes = string.Empty;
        int defaultZoomLevel = 1;
        ClearLocations();
        // Popul8 the cmbx
        for (int i = 1; i < 20; i++)
        {
            cmbxCre8MapZoomLevels.Items.Add(i.ToString());
        }
        ContentDialogResult result = await cntDlgCre8Map.ShowAsync();

        if (result == ContentDialogResult.Primary)
        {    
            mapName = txtbxMapName.Text;
            mapNotes = txtbxMapNotes.Text;
            defaultZoomLevel = cmbxCre8MapZoomLevels.SelectedIndex + 1;
            InsertMapRecord(mapName, mapNotes, preferredZoomLevel);
        }
        // else do nothing (don't save)
    }
    catch (Exception ex)
    {
        MessageDialog exceptionMsgDlg = new MessageDialog(ex.Message, "btnCre8NewMap_Click");
        await exceptionMsgDlg.ShowAsync();
    }
}