WP7 - 启动屏幕无法在调试器会话外工作

时间:2011-08-12 06:49:39

标签: silverlight windows-phone-7 windows-phone-7.1

当我的MainPage加载到我的Windows Phone 7应用程序中时,它会触发一个弹出式启动画面,其中包含一个进度条和一个用户控件中的图形。显示spash屏幕后,我在BackgroundWorker线程中做了一些工作,在spash显示时加载一些资源。加载完成后,我关闭弹出窗口。这项技术已在WindowsPhoneGeek中详细记录。

我今天注意到,虽然在Visual Studio下运行时运行完美无缺,但如果我在没有连接调试器的情况下直接运行相同的构建,则不会出现启动画面动画和进度条,并且DoWork()线程至少占用执行相同操作的时间是原来的两倍。我可以看到MainPage构造函数被调用以及OnNavigatedTo,但弹出窗口仍然没有显示,默认的jpg splash图像保留在屏幕上,直到工作线程完成。然后弹出窗口显示< 1秒,主页显示。同样,在通过VS 2010进行调试时,这一切都完美无瑕。

这一切都在模拟器中,我还没有设备。我今天刚刚注意到这一点,而且恰巧(?)我昨晚将环境更新为7.1。

    // Constructor
    public MainPage()
    {
        InitializeComponent();

        IDictionary<string, object> state = Microsoft.Phone.Shell.PhoneApplicationService.Current.State;

        if (!state.ContainsKey(STATE_WAS_LOADED))
        {
            state[STATE_WAS_LOADED] = "LOADED";

            this.LayoutRoot.Visibility = System.Windows.Visibility.Collapsed;

            _popup = new Popup();
            _popup.Child = new NPGSplash();
            System.Diagnostics.Debug.WriteLine("{0}: Displaying Splash Popup", DateTime.Now.ToString("ss.ffff"));
            _popup.IsOpen = true;

            // Asynchronously load the biggest dataset
            StartLoadingData();
        }
    }

    private void StartLoadingData()
    {
        _worker = new BackgroundWorker();
        _worker.DoWork += new DoWorkEventHandler(_worker_DoWork);
        _worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_worker_RunWorkerCompleted);
        _worker.RunWorkerAsync();
    }

    void _worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        this.Dispatcher.BeginInvoke(() => 
        {
            System.Diagnostics.Debug.WriteLine("{0}: Splash RunWorkerCompleted", DateTime.Now.ToString("ss.ffff"));
            this.LayoutRoot.Visibility = System.Windows.Visibility.Visible;
            this._popup.IsOpen = false; 
        });
    }

修改

本周我最终在ebay上购买了一个设备,以确保我不会发布我无法确认其正常运行的应用。我可以确认无论出现什么问题,在设备上运行应用程序时都不会发生这种情况。好消息。尽管如此,我还是无法解释在调用consrtuctor之后我的应用程序暂停了大约3-5秒。我甚至改变了构造函数中的逻辑,将System.Windows.Threading.DispatcherTimer设置为在100ms内触发以启动逻辑。当此代码执行时,构造函数完成,但计时器不会勾选3-5秒。很奇怪,只有在没有连接到调试器的模拟器中。

1 个答案:

答案 0 :(得分:0)

这里的问题似乎是你永远不会将Popup控件附加到可视化树上。说实话,我不知道为什么这会对附加的调试器起作用,但是我将从你的代码中解释出来。

我认为您需要做的是将Popup控件添加为MainPage的XAML中的元素,以便将其附加到可视树中。

我要说的另一件事是,将构造函数中的所有数据加载代码移入OnNavigatedTo的覆盖或Loaded事件的处理程序可能是值得的。一般来说,最好保持构造函数尽可能短而简单(是的,我感谢您使用后台工作程序来加载数据)。