WP8自定义消息框崩溃

本文关键字:崩溃 自定义消息 WP8 | 更新日期: 2023-09-27 18:14:16

我制作了一个自定义消息框(这里讨论),显示本地化的退出提示符。

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");
    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;
    //some more features
}

它工作得很好,但是当它作为独立运行时(没有Visual Studio),如果用户不按任何东西,它会在几秒钟后崩溃。

我试着用Visual studio的发布和调试来复制同样的崩溃,但它是尽可能稳定的。只有当应用程序从手机上运行时才会崩溃。

如何找到问题?原因是什么呢?据我所知,我无法访问设备上的崩溃日志。也许应该有一些消息框逻辑?

乌利希期刊指南关于你的建议,我想说几句,Neil:

首先VS警告我"async方法缺少await"之类的东西。

其次,我不确定如何返回信息到"BackKeyPressed",e.c cancel应该等于"false"。这应该是退出应用程序的安全方法。

如果我们从它运行异步方法,我们不会退出"OnBackKeyPress"方法吗?这就意味着我们不能让它知道我们的决定(e.Cancel = false)。

或者如果我们不退出"OnBackKeyPress",那么这可能意味着这个事件将停留太长时间,整个目的都失去了-应用程序将被杀死,对吗?

UPD2:

似乎我在Scylla和Charybdis之间:要么我显示一个消息框,并在运行时经历崩溃,这是指导方针不鼓励的,或者我根本不显示消息框。

我已经尝试了本地消息框和我的自定义消息框的实现与本地化的"确定"answers"取消"按钮。它们的行为是一样的:要么是同步的,挂起OnBackKeyPress,要么是异步的,在我们让它知道用户的决定之前,OnBackKeyPress就退出了。

最终决定

显然,指导方针表明我们根本不应该询问用户的确认。由于没有可行的方法来实现一个工作的退出确认消息框而不崩溃,我决定不显示它。

WP8自定义消息框崩溃

如果你阻塞或延迟某些页面事件太长时间,操作系统会杀死你的应用程序,因为它认为它已经崩溃了…

  • OnNavigatedTo
  • OnNavigatedFrom
  • OnBackKeyPress

在你的情况下,我建议把自定义的MessageBox在它自己的方法,然后在UI线程上调用它。

private void customMessageBox()
{
    // custom message box code
    // use NavigationService.GoBack() if you need to exit
}
protected override void OnBackKeyPress(CancelEventArgs e)
{
    e.Cancel = true;
    Deployment.Current.Dispatcher.BeginInvoke(() => customMessageBox() );
}

我还找到了另一个答案,通过使方法Async来完成这件事。


调试器已连接(或未连接)

当Visual Studio调试器被附加时,操作系统不会警告你某些错误,如高内存使用,页面初始化延迟等-所以在没有Visual Studio调试器的情况下测试你的应用程序非常重要,无论是在设备上还是在模拟器中(Debug或Release)


Windows Phone 8.1

请注意,在WP8.1 XAML/WinRT应用程序中,后退按钮的处理方式发生了变化。如果你将来要升级应用项目,这可能是你需要考虑的问题。

我在我的项目中实现了这一点,它工作了。试一试!

 protected override void OnBackKeyPress(CancelEventArgs e)
        {

            base.OnBackKeyPress(e);
            e.Cancel = true;
            Deployment.Current.Dispatcher.BeginInvoke(() =>
                           {
                               MessageBoxResult result = MessageBox.Show("Hello", "Msg Box", MessageBoxButton.OKCancel);
                               if (result == MessageBoxResult.OK)
                               {
                                   //Do something
                               }
                               else
                               {
                                   //Do something
                               }
                           });

        }