覆盖后退按钮,尝试显示Coding4Fun MessagePrompt

时间:2014-03-06 21:07:51

标签: c# windows-phone-8 back-button

我正在开发一个简单的游戏,如果用户点击后退按钮,我不希望它返回到上一页,也不希望终止该应用程序。我想显示一个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));
    }

2 个答案:

答案 0 :(得分:1)

我没有编码4fun控件的专家,但经过测试,这似乎是他们的错,而不是你的。

你有一些解决方案:

  1. 使用另一个图书馆中的另一个控件或由您构建。
  2. 更改应用向用户显示消息的方式。
  3. 使用解决方法,例如,这似乎有效:

    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();
    }
    
  4. 但请注意,我不确定只是完成任务总会给你想要的结果。 或者你可以使用等待await Task.Delay(1);,但再次使用延迟这种做法真的是一种不好的做法。

答案 1 :(得分:1)

控件确实在后退按钮上执行挂钩,因为后退按钮可以关闭提示。

在c4f工具包上创建一个repro,我会仔细研究它。

http://coding4fun.codeplex.com/WorkItem/Create