Coding4Fun是WP7平台的一个很好用的控件库,提供了一些控件和转换器。地址:http://coding4fun.codeplex.com/
有时间把使用这个控件库的问题记录下来。(注:本文的内容作者已经在新版本中做了修正)
MessagePrompt是一个提示框,可以方便的弹出一个类似popup的对话框。可以先自己写一个UserControl,然后设置为MessagePrompt的Body,定制很方便。使用方法比较简单,官网上都有。
前段时间遇到一个问题。在华容道的游戏页面中,我禁用了Back键回退的功能,而是弹出一个暂停对话框,避免用户不小心误按Back键退出游戏。我使用了一个UserControl,里面放了几个按钮,可以继续、查看过关记录和回到主菜单等。按照我的想法,如果此时用户按Start键返回开始界面,然后再按Back键返回游戏的时候,这个暂停对话框应该仍为显示状态。
我是用以下方法实现的:
把这个暂停对话框设置为页面级变量,然后在OnNavigatedFrom事件中,判断此对话框的状态,并记录在State中。然后在OnNavigatedTo事件中,读取对话框状态,并根据需要显示或不显示。
主要代码如下:
OnNavigatedFrom事件:
//如果正在显示暂停对话框 保存一下状态
if (this.pausePrompt != null && this.pausePrompt.IsOpen)
{
AppStateHelper.IsPausePromptOpen = true;
}
else
{
AppStateHelper.IsPausePromptOpen = false;
}
OnNavigatedTo事件:
//显示暂停对话框
if (AppStateHelper.IsPausePromptOpen == true)
{
this.ShowPausePrompt();
}
显示暂停对话框:
/// <summary>
/// Shows the pause prompt.显示暂停对话框
/// </summary>
private void ShowPausePrompt()
{
pausePrompt = new MessagePrompt();
pausePrompt.Body = new GamePausePrompt();
//清除自带的按钮
pausePrompt.ActionPopUpButtons.Clear();
GamePausePrompt gamePausePrompt = pausePrompt.Body as GamePausePrompt;
Coding4Fun.Phone.Controls.RoundButton btnResume = gamePausePrompt.FindName("btnResume") as Coding4Fun.Phone.Controls.RoundButton;
btnResume.Click += new RoutedEventHandler(btnResume_Click);
//Button btnLoad = gamePausePrompt.FindName("btnLoad") as Button;
//btnLoad.Click += new RoutedEventHandler(btnLoad_Click);
Coding4Fun.Phone.Controls.RoundButton btnRecord = gamePausePrompt.FindName("btnRecord") as Coding4Fun.Phone.Controls.RoundButton;
btnRecord.Click += new RoutedEventHandler(btnRecord_Click);
Coding4Fun.Phone.Controls.RoundButton btnPauseMainMenu = gamePausePrompt.FindName("btnPauseMainMenu") as Coding4Fun.Phone.Controls.RoundButton;
btnPauseMainMenu.Click += new RoutedEventHandler(btnMainMenu_Click);
pausePrompt.Show();
}
但调试时总是提示错误。而且ApplicationBar也有问题,一会出现一会不出现,正常情况下在弹出对话框显示的时候ApplicationBar应该是不显示的。
我在codeplex上发帖询问,作者说在离开页面时,VisualTree已经被破坏了,导致再次显示时出现问题。我觉得可能在OnNavigatedTo里设置页面还没有Load完,可能跟Popup有冲突吧。后来改了一下,把恢复对话框的部分用Dispatcher呼叫,就可以正常恢复显示了。具体原因我也搞不大明白。之前把此问题提交给作者了,他很快提供了一个更新版本:
fixed a OnNavigatedTo bug. since page doesn't exist yet, causes weird state. all code that touches a page now is wrapped in a dispatcher call rather than only the Show call.
看源代码的确是改动了以下部分:
············Dispatcher.BeginInvoke(()·=>·_popUp.Show());
············_popUp.Show();
两个Demo,一个是之前提问题的,会有文中的错误,一个是我改动后的,可以正常显示。
新版本还没有测试,估计用新版本应该可以直接Show了。