我制作了一个自定义消息框(discussed here),显示了本地化的退出提示。
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 Studion中的Release和Debug来附加与手机相同的崩溃,但它尽可能稳定。它只会在手机本身运行应用程序时崩溃。
如何找到问题?可能是什么原因呢?据我所知,我无法访问设备上的崩溃日志。 或许应该有一些消息框逻辑?
UPD 很少有关于你的建议的说明,Neil :
首先,VS警告我“异步方法缺乏等待”的东西。
其次我不知道如何将信息返回给“BackKeyPressed”,即e.Cancel应该等于“false”。这应该是退出应用AFAIK的安全方式。
如果我们从它运行异步方法,我们不会退出“OnBackKeyPress”方法吗?这意味着我们不能让它知道我们的决定(e.Cancel = false)。
或者,如果我们不退出“OnBackKeyPress”,那么这可能意味着这个事件会停留太久而且整个目的都会丢失 - 应用程序会被杀死,对吗?
UPD2:
似乎我介于Scylla和Charybdis之间:要么我在运行时显示消息框并遇到崩溃问题,否则我不会显示消息框。
我已尝试使用本地化的MessageBox和我自定义消息框的实现,并使用本地化的“确定”和“取消”按钮。它们的行为相同:它们是同步的并挂起OnBackKeyPress
,或者它们是异步和OnBackKeyPress
退出,然后才能让它知道用户的决定。
最终决定
显然,指南声明我们根本不应该询问用户的确认。 由于没有可行的方法来实现工作退出确认消息框而不会崩溃我决定根本不显示它。
答案 0 :(得分:1)
如果您阻止或延迟某些页面事件的时间太长,操作系统会因为假设崩溃而终止您的应用...
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() );
}
我还找到了另一个完成事情by making the method Async的答案。
当附加Visual Studio调试器时,操作系统不会警告您某些错误,例如高内存使用率,页面初始化延迟等 - 因此,在设备上未连接Visual Studio调试器的情况下测试应用程序非常重要或在模拟器中(调试或发布)
请注意the handling of the Back button has changed in WP8.1 XAML/WinRT apps。如果您将来升级应用项目,可能需要考虑这个问题。
答案 1 :(得分:0)
我在我的项目中实现了它并且它有效。试试吧!
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
}
});
}