我的目标是在可移植的库中安装messagedialog,这样我也可以在Metro C#/ XAML和Windows Phone中使用它。
我用Google搜索并发现:http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.popups.messagedialog,这符合我的需求。
在它的例子之后我制作了这段代码:
public static async Task<string> Egyszerű(string Fejléc, string Szöveg, params string[] Gombfeliratok)
{
string kérdésreAdottVálasz = null;
MessageDialog kérdés = new MessageDialog(Szöveg, Fejléc);
foreach (string válasz in Gombfeliratok)
{
kérdés.Commands.Add(new UICommand(válasz, new UICommandInvokedHandler(delegate { kérdésreAdottVálasz = válasz; })));
}
kérdés.DefaultCommandIndex = 0;
kérdés.CancelCommandIndex = 1;
await kérdés.ShowAsync();
//esetleges utófeldolgozás helye itt
//..
return kérdésreAdottVálasz;
}
}
并将其放入便携式库中。
我从主程序中调用它:
private void someEvent(object sender, ItemClickEventArgs e)
{
if (Kérdés.Egyszerű("SURE?", "Are you sure, blablabla?", "YES", "NO").Result == "YES")
{
//stuff
}
}
出现消息对话框,我也可以回答,但在此之后程序将冻结。代表不会运行。
任何人都可以告诉我,如何解决这个问题或者展示一个更好的(我的意思是工作)例子来进行这样的对话?
答案 0 :(得分:1)
当您编写:Kérdés.Egyszerű("SURE?", "Are you sure, blablabla?", "YES", "NO").Result
时,您将阻止UI线程,直到异步操作完成,以便您可以访问其结果。
Egyszerű
正在安排一个延续(await
之后的所有内容)在UI线程中运行,当它可用时。
因此,您的UI线程正在等待Egyszerű
完成,Egyszerű
正在等待UI线程可用,然后才能完成。死锁。
在等待操作完成时,您不需要阻止UI线程。您需要“始终保持异步”,以便UI保持响应并能够执行最底层事件的延续。
private async void someEvent(object sender, ItemClickEventArgs e)
{
if (await Kérdés.Egyszerű("SURE?", "Are you sure, blablabla?", "YES", "NO")
== "YES")
{
//stuff
}
}