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了。

  • 相关阅读:
    Matlab 绘制三维立体图(以地质异常体为例)
    Azure DevOps的variable group实现array和hashtable参数的传递
    Azure DevOps 利用rest api设置variable group
    Azure AADSTS7000215 其中一种问题的解决
    Power BI 实现实时更新Streaming Dataset
    AAD Service Principal获取azure user list (Microsoft Graph API)
    Matlab 沿三维任意方向切割CT图的仿真计算
    Azure Powershell script检测登陆并部署ARM Template
    Azure KeyVault设置策略和自动化添加secrets键值对
    Azure登陆的两种常见方式(user 和 service principal登陆)
  • 原文地址:https://www.cnblogs.com/yanxiaodi/p/2427979.html
Copyright © 2011-2022 走看看