自定义MessageBox,用于在Windows Phone中退出

时间:2014-07-21 13:33:23

标签: c# windows-phone-8

如果用户点击"返回"我正在显示一个消息框在游戏应用程序的主页面上。

通常的解决方案

MessageBoxResult res = MessageBox.Show(txt, cap, MessageBoxButton.OKCancel);
    if (res == MessageBoxResult.OK)
    {
        e.Cancel = false;
        return;
    }

对我不起作用,因为我需要将这些按钮本地化,而不是使用手机的本地化,而是使用应用程序的选定语言(即,如果用户的手机具有英语区域设置)他已经将应用程序的语言设置为法语,按钮应该是" Oui""非"而不是默认" OK"和&# 34;取消"。)

我尝试了以下方法,它在视觉上有效:

protected override void OnBackKeyPress(CancelEventArgs e)
{
    //some conditions
    e.Cancel = true;
    string quitText = DeviceWrapper.Localize("QUIT_TEXT");
    string quitCaption = DeviceWrapper.Localize("QUIT_CAPTION");
    string quitOk = DeviceWrapper.Localize("DISMISS");
    string quitCancel = DeviceWrapper.Localize("MESSAGEBOX_CANCEL");
    Microsoft.Xna.Framework.GamerServices.Guide.BeginShowMessageBox(
        quitCaption, 
        quitText,
        new List<string> { quitOk, quitCancel }, 
        0, 
        Microsoft.Xna.Framework.GamerServices.MessageBoxIcon.Error,
        asyncResult =>
        {
            int? returned = Microsoft.Xna.Framework.GamerServices.Guide.EndShowMessageBox(asyncResult);
            if (returned.Value == 0) //first option = OK = quit the game
            {
                e.Cancel = false;
                return;
            }
        }, 
        null);
    //some more features
}

但它并没有退出申请。

我应该使用哪种方法?我不会使用&#34;终止&#34;因为它是一个相当大的应用程序,以这种方式退出它并不好。

1 个答案:

答案 0 :(得分:2)

它不会退出,因为BeginShowMessageBox()是异步的。这意味着调用将立即返回,因为您将e.Cancel设置为true,然后应用程序将永远不会关闭(当您的事件处理程序将被执行时调用方法结束而不退出)。

等待用户关闭对话框以将e.Cancel设置为正确的值(省略AsyncCallback参数)。首先删除回调:

IAsyncResult asyncResult = Guide.BeginShowMessageBox(
    quitCaption, quitText, new List<string> { quitOk, quitCancel }, 
    0, MessageBoxIcon.Error, null, null);

然后等待对话框关闭:

asyncResult.AsyncWaitHandle.WaitOne();

最后,您可以检查其返回值(就像您在原始回调中所做的那样):

int? result = Guide.EndShowMessageBox(asyncResult);
if (result.HasValue && result.Value == 0)
    e.Cancel = false;