【问题标题】:Can I make a ContentDialog.Async() await another ContentDialog.Async() in UWP?我可以让 ContentDialog.Async() 在 UWP 中等待另一个 ContentDialog.Async() 吗?
【发布时间】:2020-03-02 10:51:42
【问题描述】:

我正在运行一个包含 2 个页面的 UWP 应用。在 MainPage 中,我启动了一个 ContentDialog Async 方法,该方法在框架中打开 page2。在 page2 中,我有一个辅助 ContentDialog,我通过按一个按钮打开它。 在 Button_Click 方法中,我想关闭正在运行的 Async() 方法并等待启动下一个方法,直到我 100% 确定第一个方法已关闭。

我现在遇到的问题是,如果我打开第二个ContentDialog的按钮太快,程序就会崩溃。

我尝试过线程休眠,但这只会延迟问题。

主页(客户信息页):

transactionContent = new ContentDialog();
Frame transactionFrame = new Frame();
transactionFrame.Navigate(typeof(TransactionPage), selectedAccount);

transactionContent.Content = transactionFrame;

transactionContent.ShowAsync();

Page2(TransactionPage):

private async void DepositButton_ClickAsync(object sender, RoutedEventArgs e)
{
    CustomerInfoPage.transactionContent.Hide();
    ContentDialog confirmationDialog = new ContentDialog
    {
        Title = "Deposit Funds.",
        Content = $"You will deposit {depositTextBox.Text} SEK.\nYour new balance will be: {ReceivedAccount.Balance + deposit} SEK",
        PrimaryButtonText = "CONFIRM",
        SecondaryButtonText = "CANCEL"

    };
    confirmationDialog.PrimaryButtonClick += ConfirmationDialog_PrimaryButtonClick;
    await confirmationDialog.ShowAsync();

    async void ConfirmationDialog_PrimaryButtonClick(ContentDialog _sender, ContentDialogButtonClickEventArgs args)
    {
        confirmationDialog.Hide();
    }
    CustomerInfoPage.transactionContent.ShowAsync();
}

因此,只要您在 ConfirmationDialog_PrimaryButtonClick 打开后立即单击它,不要太快调用它。

【问题讨论】:

    标签: c# .net events uwp


    【解决方案1】:

    这是在UWP documentation about Dialog 中介绍的。

    每个线程一次只能打开一个 ContentDialog。尝试打开两个 ContentDialog 将引发异常,即使它们尝试在单独的 AppWindows 中打开也是如此。

    因此,当第一个 ContentDialog 仍在运行时,您无法启动第二个 CotnentDialog

    最好的问候。

    【讨论】:

    • 我知道这一点,这就是为什么我在打开下一个之前使用.Hide();。但是,如果我在新内容对话框中的点击速度很快,并且在新内容对话框打开后的速度超过一秒钟,.Hide() 方法在下一个Async() 运行之前永远不会完成,导致程序“认为”我正在运行 2 个内容对话框.如果我在按下任何东西之前等待 1 秒钟,程序会按预期工作。
    • 您好,当您调用ContentDialog.Hide()时,ContentDialog处于Closing状态。事实上,ContentDialog 在执行await ContentDialog.ShowAsync() 之前不会处于 Closed 状态。所以调用Hide方法并不意味着你的ContentDialog已经完成了当前线程的工作。
    • 啊,我明白了!通过将 ShowAsync() 方法分成两个方法来解决它,我用等待从 buttonclick 方法调用!感谢您的澄清!
    • 也许我们可以使用弹出窗口
    【解决方案2】:

    正如@Richard Zhang - MSFT 在之前的回答中所说的

    所以你不能在第一个 CotnentDialog 的时候启动第二个 CotnentDialog ContentDialog 仍在运行。

    如果您想在打开新的ContentDialog 之前关闭上一页的ContentDialog,您可以使用下面的代码来关闭当前打开的任何ContentDialog

    var openedpopups = VisualTreeHelper.GetOpenPopups(Window.Current);
    foreach (var popup in openedpopups)
    {
       if(popup.Child is ContentDialog)
       {
          (popup.Child as ContentDialog).hide();
       }
    }
    

    【讨论】:

    • 我在ConfirmationDialog_PrimaryButtonClick(Page2) 中使用confirmationDialog.Hide(); 关闭了 ContentDialog。然后我运行公共静态CustomerInfoPage.transactionContent.ShowAsync(); (Page1)
    • 在这种情况下,使用上面的代码检查任何内容对话框是否仍然打开。如果它打开然后在while循环中等待它然后调用ShowAsync()
    猜你喜欢
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2021-07-13
    • 2021-01-02
    • 1970-01-01
    • 2020-12-27
    相关资源
    最近更新 更多