2011-08-12 13 views
1

メインページがWindows Phone 7アプリケーションに読み込まれると、プログレスバーとユーザーコントロールのグラフィックが含まれたポップアップスプラッシュ画面が表示されます。スプラッシュ画面を表示した後、Spashが表示されている間、BackgroundWorkerスレッドでいくつかのリソースを読み込むように動作します。読み込みが完了したら、私はポップアップを閉じます。この技術は、WindowsPhoneGeekに詳しく記載されています。WP7 - デバッガセッション外でスプラッシュ画面が動作しない

Visual Studioでデバッグを実行中に問題なく動作しているのに、デバッガを接続せずに同じビルドを直接実行すると、スプラッシュ画面のアニメーションとプログレスバーが表示されず、DoWork()スレッドが同じ操作を実行するのに少なくとも2倍の時間がかかります。 MainPageのコンストラクタはOnNavigatedToと同様に呼び出されますが、ポップアップは表示されず、ワーカースレッドが完了するまでデフォルトのjpgスプラッシュイメージが画面に残ります。ポップアップが<に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; 
     }); 
    } 

EDIT:

私は私はそれが正しく動作していることを確認することができないアプリをリリースしていないことを確認するために、今週ebayでデバイスを購入してしまいました。問題が何であっても、デバイス上でアプリケーションを実行しているときに問題が発生しないことを確認できます。良いニュース。それでも、私は、コントータが呼ばれた後に、私の申請書に約3〜5秒間休止しているように見えるものは説明できません。私は論理をキックオフするためにコンストラクタのロジックを変更して、System.Windows.Threading.DispatcherTimerを100msで起動するようにしました。このコードが実行されると、コンストラクタは完了しますが、タイマーは3〜5秒間はチェックされません。非常に奇妙で、デバッガに接続されていないときはシミュレータでのみです。

答えて

0

ここでの問題は、Popupコントロールをビジュアルツリーにアタッチすることはないということが考えられます。正直言って、私はこの問題がデバッガをつけたままで動作するのかどうか分かりませんが、私はあなたのコードから解釈できるものを外しています。

PopupコントロールをXAMLの要素としてMainPageに追加して、ビジュアルツリーに添付するようにしてください。

もう1つは、データロードコードをすべてコンストラクタから移動して、OnNavigatedToのオーバーライドまたはLoadedイベントのハンドラに移動する価値があると言います。一般に、コンストラクタをできるだけ短く、シンプルに保つことがベストです(データを読み込むためにバックグラウンドワーカーを使用していることに感謝します)。

+0

私はOnNavigatedToに初期コードを置くことに関して同じことを考えていました。私はそれを試み、それは同じように動作します。私は今夜​​、XAMLにポップアップを置くというアイデアを見ていきます。私はそれを試みたことはありません。 – CactusPCJack

関連する問題