zoukankan      html  css  js  c++  java
  • 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,一个是之前提问题的,会有文中的错误,一个是我改动后的,可以正常显示。

    有问题的Demo

    能正常显示的

    新版本还没有测试,估计用新版本应该可以直接Show了。

  • 相关阅读:
    vuex插件
    axios
    token登录验证
    mysql模糊查询
    Koa2+Mysql搭建简易博客
    正则匹配器
    编码
    Maven学习
    防止重复提交保证幂等的几种解决方案
    策略模式优化if-else
  • 原文地址:https://www.cnblogs.com/yanxiaodi/p/2427979.html
Copyright © 2011-2022 走看看