我正在开发一个简单的游戏,如果用户点击后退按钮,我不希望它返回到上一页,也不希望终止该应用程序。我想显示一个MessagePrompt(来自Coding4Fun控件库),询问用户是否真的想要返回主菜单(并且在游戏中失去所有进度)。
问题是,当我实现下面的代码时,MessagePrompt会出现,但会很快关闭。任何暗示正在发生的事情。如果在常规按钮中应用完全相同的代码(e.Cancel和base.OnKeyPress除外),则会正确显示MessagePrompt。我显然用这个BackButton搞砸了。
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
e.Cancel = true;
MessagePrompt abortConfirm = new MessagePrompt();
abortConfirm.Title = "Are you sure you want to go to Main Menu?";
abortConfirm.Message = "All progress in the current game will be lost";
Button confirmAbort = new Button();
confirmAbort.Content = "Yes";
confirmAbort.Click += (object sender3, RoutedEventArgs e3) =>
{
NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.RelativeOrAbsolute));
};
Button cancelAbort = new Button();
cancelAbort.Content = "No";
cancelAbort.Click += (object sender2, RoutedEventArgs e2) =>
{
abortConfirm.Hide();
};
abortConfirm.ActionPopUpButtons.Clear();
abortConfirm.ActionPopUpButtons.Add(confirmAbort);
abortConfirm.ActionPopUpButtons.Add(cancelAbort);
abortConfirm.Show();
base.OnBackKeyPress(e);
}
有关正在发生的事情的任何提示?
Iff我尝试了旧的MessageBox(下面的代码),它就像一个魅力。问题是,游戏是一个记忆游戏,所以如果用户在正确的时间点击后退按钮,他将能够部分看到下面的屏幕(因为MessageBox.Show()暂停背景上的所有内容,包括我的DispatcherTimer。我已经在使用Coding4Fun的MessagePrompt获取其他功能,所以一致性也很受欢迎。
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
e.Cancel = true;
if (MessageBox.Show("Are you sure you want to exit?", "Confirm Exit?",
MessageBoxButton.OKCancel) != MessageBoxResult.OK)
{
e.Cancel = true;
}
else NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.RelativeOrAbsolute));
}
答案 0 :(得分:1)
我没有编码4fun控件的专家,但经过测试,这似乎是他们的错,而不是你的。
你有一些解决方案:
使用解决方法,例如,这似乎有效:
protected override async void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
e.Cancel = true;
base.OnBackKeyPress(e);
await Task.Yield();
MessagePrompt abortConfirm = new MessagePrompt();
abortConfirm.Title = "Are you sure you want to go to Main Menu?";
abortConfirm.Message = "All progress in the current game will be lost";
Button confirmAbort = new Button();
confirmAbort.Content = "Yes";
confirmAbort.Click += (object sender3, RoutedEventArgs e3) =>
{
NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.RelativeOrAbsolute));
};
Button cancelAbort = new Button();
cancelAbort.Content = "No";
cancelAbort.Click += (object sender2, RoutedEventArgs e2) =>
{
//abortConfirm.Hide();
};
abortConfirm.ActionPopUpButtons.Clear();
abortConfirm.ActionPopUpButtons.Add(confirmAbort);
abortConfirm.ActionPopUpButtons.Add(cancelAbort);
abortConfirm.Show();
}
但请注意,我不确定只是完成任务总会给你想要的结果。
或者你可以使用等待await Task.Delay(1);
,但再次使用延迟这种做法真的是一种不好的做法。
答案 1 :(得分:1)
控件确实在后退按钮上执行挂钩,因为后退按钮可以关闭提示。
在c4f工具包上创建一个repro,我会仔细研究它。