2011-03-02 88 views
1

用来当打开我有以下代码:WP7弹出延迟与位置

ShowPoup(); 
if (_watcher == null) 
{ 
    _watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High); 
    _watcher.MovementThreshold = 15; // use MovementThreshold to ignore noise in the signal 
    _watcher.StatusChanged += new EventHandler<GeoPositionStatusChangedEventArgs>(watcher_StatusChanged); 
} 

if (!_watcher.TryStart(true, TimeSpan.FromSeconds(3))) 
{ 
    MessageBox.Show("Please turn on location services on device under Settings."); 
    //HidePopup(); 
} 

我的问题是,弹出窗口不会出现,直到_watcher.TryStart()方法返回后。弹出窗口的目的是显示加载覆盖图,告诉用户应用程序正在做什么。在工作完成后显示它是毫无意义的,在这一点上,我隐藏了弹出窗口,因此用户从不会看到任何内容。

我在整个应用程序中都有这个弹出代码,这是我第一次遇到这个问题。即使我在调用当前方法之前在单独的方法中调用ShowPopup(),它仍然不会在_watcher启动之后才显示。我不知道为什么会发生这种情况。

回答

2

看起来你在TryStart期间阻塞了UI线程。如果您可以将观察者初始化移动到后台线程(例如,线程池),那么您可以保持显示“活着”。

喜欢的东西:

ShowPoup(); 
if (_watcher == null) 
{ 
    _watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High); 
    _watcher.MovementThreshold = 15; // use MovementThreshold to ignore noise in the signal 
    _watcher.StatusChanged += new EventHandler<GeoPositionStatusChangedEventArgs>(watcher_StatusChanged); 
} 

System.Threading.ThreadPool.QueueUserWorkItem((ignored) => 
{ 
    if (!_watcher.TryStart(true, TimeSpan.FromSeconds(3))) 
    { 
     Dispatcher.BeginInvoke(() => 
     { 
      HidePopup(); 
      MessageBox.Show("Please turn on location services on device under Settings."); 
     } 
    }); 
}); 
+0

实际上,该代码需要另一个HidePopup()用于当trystart成功 - 但我希望你的想法! – Stuart 2011-03-02 20:46:31

+0

谢谢,这是有效的。 – CACuzcatlan 2011-03-02 21:12:59