Coding4Fun控件系列:在导航出页面后再导航回来的时候如何保持MessagePrompt的状态
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了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?