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
就退出了。
最终决定
显然,指导方针表明我们根本不应该询问用户的确认。由于没有可行的方法来实现一个工作的退出确认消息框而不崩溃,我决定不显示它。
如果你阻塞或延迟某些页面事件太长时间,操作系统会杀死你的应用程序,因为它认为它已经崩溃了…
-
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
}
});
}