为什么MessageDialog不起作用?

时间:2014-05-27 17:03:30

标签: c# windows-phone-8 microsoft-metro

我的目标是在可移植的库中安装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
  }
}

出现消息对话框,我也可以回答,但在此之后程序将冻结。代表不会运行。

任何人都可以告诉我,如何解决这个问题或者展示一个更好的(我的意思是工作)例子来进行这样的对话?

1 个答案:

答案 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
    }
}