可以对ContentDialog进行排队并在另一个关闭后显示它吗? 我用它来查找ContentDialog
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,则会抛出一个异常,即操作启动不正确。
更新 根据Jayden Gu - 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 :(得分:1)
我创建了一个复制JavaScript var stream = recognizeMic({
token: token,
objectMode: false, // send objects instead of text
extractResults: false, // convert {results: [{alternatives:[...]}], result_index: 0} to {alternatives: [...], index: 0}
format: false // optional - performs basic formatting on the results such as capitals an periods
});
stream.setEncoding('utf8');
stream.on('data', (data) => {
console.log(data);
var txt = JSON.stringify(data);
console.log(txt);
if (txt === "example") {
console.log("Success");
window.open("https://www.example.com")
}
});
stream.on('error', function(err) {
console.log(err);
});
//document.querySelector('#stop').onclick = stream.stop.bind(stream);
}).catch(function(error) {
console.log(error);
});
}
函数功能的函数。它创建一个ContentDialog并将其添加到队列中。事件处理程序确保当Dialog关闭时,它将自己从队列中删除,并为队列中的下一个Dialog调用Alert()
,假设有一个。
ShowAsync()
我将静态函数放在App.xaml.cs中(以及队列和对话框关闭的事件处理程序),所以你可以像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.Alert("Hello world")
添加参数以填充ContentDialog的不同属性。
答案 1 :(得分:0)
您可以改为使用消息对话框。
await new MessageDialog("First").ShowAsync();
await new MessageDialog("Second").ShowAsync();
答案 2 :(得分:0)
您可以将它们存储在某个集合中,然后逐个显示它们:
List<ContentDialog> dialogs = new List<ContentDialog>()
{
contentDialog1,
contentDialog2,
contentDialog3
};
foreach (ContentDialog dialog in dialogs)
{
await dialog.ShowAsync();
}
答案 3 :(得分:0)
一次只能显示一个ContentDialog。
如果显示一个ContentDialog
,我们就无法显示另一个ContentDialog
。当您在ShowAsync
的{{1}}事件中添加LostFocus
方法并使用点击按钮时,它会同时显示两个TextBox
。
如果可以显示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
中。
答案 4 :(得分:0)
由于您需要对多个内容对话框进行排队,因此您可以尝试这样做:
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()
,其余部分将根据用户的选择进行处理..
希望这会有所帮助..