Могу ли я сделать ContentDialog.Async () ожидающим другого ContentDialog.Async () в UWP? - PullRequest
0 голосов
/ 06 ноября 2019

Я запускаю приложение UWP с 2 страницами. В MainPage я запускаю асинхронный метод ContentDialog, который открывает страницу 2 во фрейме. На странице 2 у меня есть дополнительный ContentDialog, который я открываю нажатием кнопки. В методе Button_Click я хочу закрыть работающий метод Async () и ожидать запуска следующего, пока я не буду на 100% уверен, что первый из них закрыт.

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что программа аварийно завершает работу, если я нажимаю кнопки вторичного ContentDialog слишком быстро после его открытия.

Я пробовал спящий поток, но это только задерживает проблему.

Главная страница (CustomerInfoPage):

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_PrimaryButtonНажмите слишком быстро, нажав насразу после открытия.

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Как сказал @Richard Zhang - MSFT в предыдущем ответе

Таким образом, вы не можете запустить второй 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();
   }
}
1 голос
/ 06 ноября 2019

Это представлено в документации UWP о Dialog .

За один поток может быть открыт только один ContentDialog для каждого потока. Попытка открыть два ContentDialogs вызовет исключение, даже если они пытаются открыть в отдельных окнах AppWindows.

Таким образом, вы не можете запустить второй CotnentDialog, пока первый ContentDialog еще работает.

С уважением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...