Можно поставить в очередь Content Dialog и показать его после закрытия другого? Я использовал это, чтобы найти Content Dialog

var popups = VisualTreeHelper.GetOpenPopups(Window.Current);
        int i = 0;
        foreach (var item in popups)
        {
            if (item.Child is ContentDialog)
                i++;
        }
        if (i == 0)
        {
            //show ContentDialog
        }
        else
            // add to my listOfContentDialog

Но если я попытаюсь открыть больше ContentDialog одновременно, это выдает исключение, что операция запускается неправильно.

< Сильный > UPDATE По словам Джейдена Гу - MSFT мой рабочий код

private List<string> testowa_lista = new List<string>();

    private async void Komunikat_siatki(string v)
    {
        if(mozeWyskoczyc)
        {
            mozeWyskoczyc = false;
            //my internal code to generate ContentDialog using v string
            testowa_lista.Remove(v);
            mozeWyskoczyc = true;
            if (testowa_lista.Count > 0)
            {
                var i = testowa_lista.First();
                Komunikat_siatki(i);
            }                    
        }
        else
        {
            testowa_lista.Add(v);
        }
    }
0
kdn29 4 Сен 2017 в 18:59

5 ответов

Лучший ответ

Только один ContentDialog может быть показан одновременно.

Если показан один ContentDialog, мы не можем показать другой ContentDialog. Когда вы добавляете метод ShowAsync в событие LostFocus TextBox и используете кнопку Tap, он отображает два ContentDialog одновременно.

Вы должны иметь возможность добавить поле bool для сохранения в состоянии, если ContentDialog может быть показано.

Например:

private async void Text_LostFocus(object sender, RoutedEventArgs e)
{
    if (dialogCanShow)
    {
        dialogCanShow = false;
        var textBox= sender as TextBox;
        var contentDialog = new ContentDialog();
        contentDialog.Title = textBox.Name;
        contentDialog.CloseButtonText = "Close";
        await contentDialog.ShowAsync();
        dialogCanShow = true;
    }
}

Когда мы закрываем ContentDialog, курсор будет отображаться в текущем TextBox.

0
Jayden 5 Сен 2017 в 08:16

Вы можете сохранить их в некоторой коллекции, а затем показывать их один за другим:

List<ContentDialog> dialogs = new List<ContentDialog>()
{
    contentDialog1,
    contentDialog2,
    contentDialog3
};

foreach (ContentDialog dialog in dialogs)
{
    await dialog.ShowAsync();
}
0
Marian Dolinský 4 Сен 2017 в 17:33

Так как вам нужно поставить в очередь несколько диалогов, вы можете попробовать это:

            int count = 1;  //count is used to simply to have dynamic content in the dialogs
            private async void startCreatingDialog()
            {
                var result = await createDialog(count.ToString()).ShowAsync();
                if (result == ContentDialogResult.Primary)
                {
                    //create a new dialog based on user's input 
                    count++;
                    startCreatingDialog();
                }

            }
            private ContentDialog createDialog(string content)
            {
                ContentDialog contentDialog = new ContentDialog()
                {                
                    Content = content,
                    //clicking on the primarybutton will create the next ContentDialog
                    PrimaryButtonText = "Show another dialog",                        
                    SecondaryButtonText = "Cancel"
                };

                return contentDialog;

            }

Чтобы начать показ очереди диалога, вам нужно позвонить startCreatingDialog(), а остальные будут обработаны в соответствии с выбором пользователя.

Надеюсь это поможет..

0
Pratyay 6 Сен 2017 в 16:28

Я создал функцию, которая копирует функциональность функции JavaScript Alert(). Он создает ContentDialog и добавляет его в очередь. Обработчик событий гарантирует, что, когда диалог закрывается, он удаляет себя из очереди и вызывает ShowAsync() для следующего диалога в очереди, при условии, что он существует.

sealed partial class App : Application
{
    ...
    private static List<ContentDialog> DialogQueue { get; } = new List<ContentDialog>();

    public static async void Alert(string text)
    {
        var Dialog = new ContentDialog()
        {
            Title = text,
            CloseButtonText = "OK"
            ...
        };
        App.DialogQueue.Add(Dialog);

        // Add event handler for when dialog closed:
        Dialog.Closed += Dialog_Closed;

        if (App.DialogQueue.Count == 1) // Only one in queue
        {
            await Dialog.ShowAsync();
        }
    }
    // Event handler for when dialog closed:
    private static async void Dialog_Closed(ContentDialog sender, ContentDialogClosedEventArgs args)
    {
        App.DialogQueue.Remove(sender);
        if (App.DialogQueue.Count > 0)
        {
            await App.DialogQueue[0].ShowAsync();
        }
    }
}

Я поместил статическую функцию в App.xaml.cs (вместе с обработчиком событий закрытия очереди и диалога), поэтому вы называете ее как App.Alert("Hello world"), хотя вы можете поместить ее в свой собственный класс. Конечно, вы можете добавить параметры в Alert(), чтобы заполнить различные свойства ContentDialog.

1
binaryfunt 16 Мар 2018 в 22:32

Вместо этого вы можете использовать диалог сообщений.

await new MessageDialog("First").ShowAsync();

await new MessageDialog("Second").ShowAsync();
0
Xeorge Xeorge 4 Сен 2017 в 16:19