Можно поставить в очередь 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);
}
}
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
.
Вы можете сохранить их в некоторой коллекции, а затем показывать их один за другим:
List<ContentDialog> dialogs = new List<ContentDialog>()
{
contentDialog1,
contentDialog2,
contentDialog3
};
foreach (ContentDialog dialog in dialogs)
{
await dialog.ShowAsync();
}
Так как вам нужно поставить в очередь несколько диалогов, вы можете попробовать это:
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()
, а остальные будут обработаны в соответствии с выбором пользователя.
Надеюсь это поможет..
Я создал функцию, которая копирует функциональность функции 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.
Вместо этого вы можете использовать диалог сообщений.
await new MessageDialog("First").ShowAsync();
await new MessageDialog("Second").ShowAsync();
Похожие вопросы
Новые вопросы
asynchronous
Асинхронное программирование - это стратегия для отсрочки операций с высокой задержкой или низким приоритетом, обычно в попытке улучшить производительность, скорость отклика и / или совместимость программного обеспечения. Такие стратегии обычно используются, используя некоторую комбинацию управляемого событиями программирования и обратных вызовов, и, возможно, используя параллелизм через сопрограммы и / или потоки.