当我的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秒。很奇怪,只有在没有连接到调试器的模拟器中。
答案 0 :(得分:0)
这里的问题似乎是你永远不会将Popup
控件附加到可视化树上。说实话,我不知道为什么这会对附加的调试器起作用,但是我将从你的代码中解释出来。
我认为您需要做的是将Popup
控件添加为MainPage
的XAML中的元素,以便将其附加到可视树中。
我要说的另一件事是,将构造函数中的所有数据加载代码移入OnNavigatedTo
的覆盖或Loaded
事件的处理程序可能是值得的。一般来说,最好保持构造函数尽可能短而简单(是的,我感谢您使用后台工作程序来加载数据)。