2011-08-12 2 views
1

내 MainPage가 내 Windows Phone 7 응용 프로그램에서로드되면 진행 표시 줄과 사용자 정의 컨트롤의 그래픽이 포함 된 팝업 스플래시 화면이 트리거됩니다. Spash 화면을 표시 한 후에 Spash가 표시되는 동안 BackgroundWorker 스레드에서 일부 리소스를로드하는 작업을 수행합니다. 로드가 완료되면 팝업을 닫습니다. 이 기술은 WindowsPhoneGeek에 잘 설명되어 있습니다.WP7 - 디버거 세션 외부에서 스플래시 화면이 작동하지 않습니다.

Visual Studio에서 디버그를 실행할 때 완벽하게 작동하지만 디버거가 연결되지 않은 상태에서 동일한 빌드를 직접 실행하면 스플래시 화면의 애니메이션과 진행률 표시 줄이 나타나지 않으며 DoWork() 스레드가 동일한 작업을 실행하는 데 최소 두 배 이상. 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; 
     }); 
    } 

편집 : 나는 내가 제대로 작동하는지 확인할 수없는 응용 프로그램을 공개하지 않도록하기 위해 이번 주에 이베이에 기기를 구입 결국

. 문제가 무엇이든 장치에서 응용 프로그램을 실행할 때 문제가 발생하지 않는다는 것을 확인할 수 있습니다. 좋은 소식. 여전히, 나는 consrtuctor가 호출 된 후 내 신청서에 약 3-5 초의 일시 중지가 나타나는 것을 설명 할 수 없습니다. 심지어 생성자에서 내 논리를 변경하여 System.Windows.Threading.DispatcherTimer을 내 논리를 시작하기 위해 100ms에서 실행하도록 설정했습니다. 이 코드가 실행되면 생성자가 완료되지만 타이머가 3-5 초 동안 틱하지 않습니다. 매우 이상하고 시뮬레이터에서만 디버거에 연결되지 않은 경우.

답변

0

여기서 문제는 시각적 트리에 Popup 컨트롤을 연결하지 않는다는 것입니다. 솔직하게 말해서, 왜 이것이 디버거가 부착 된 상태로 작동하는지 모르겠지만, 코드에서 해석 할 수있는 것을 벗어날 것입니다.

Popup 컨트롤을 MainPage의 XAML에 요소로 추가하여 시각적 트리에 첨부해야합니다.

내가 말하고 싶은 또 다른 한가지는 생성자에서 모든 데이터로드 코드를 이동하여 OnNavigatedTo에 대한 재정의 또는 Loaded 이벤트에 대한 처리기로 옮기는 것이 좋습니다. 일반적으로 가능한 한 생성자를 짧고 간결하게 유지하는 것이 가장 좋습니다 (예 : 데이터를로드하기 위해 백그라운드 작업자를 사용하는 것에 감사드립니다).

+0

나는 OnNavigatedTo에 init 코드를 넣는 것과 같은 생각을하고있었습니다. 나는 그것을 시도하고 그것은 똑같이 행동한다. 오늘 밤에 XAML에 팝업을 올리겠습니다. 나는 결코 그것을 시도하지 않았다. – CactusPCJack

관련 문제