WP7 - Заставка не работает вне сеанса отладчика - PullRequest
1 голос
/ 12 августа 2011

Когда моя MainPage загружается в мое приложение Windows Phone 7, оно вызывает всплывающий экран-заставку с индикатором выполнения и графикой в ​​пользовательском контроле. После отображения экрана-заставки я выполняю некоторую работу в потоке BackgroundWorker, чтобы загрузить некоторые ресурсы, пока отображается экран-заставка. Когда загрузка завершена, я закрываю всплывающее окно. Этот метод хорошо документирован на WindowsPhoneGeek .

Сегодня я заметил, что хотя это работает безупречно при запуске в отладке в Visual Studio, если я запускаю ту же сборку напрямую, без отладчика, анимация заставки и индикатор выполнения никогда не появляются, а поток DoWork () занимает по крайней мере вдвое дольше, чтобы выполнить те же операции. Я вижу, что конструктор MainPage вызывается так же, как и OnNavigatedTo, но всплывающее окно по-прежнему не отображается, и изображение заставки jpg по умолчанию остается на экране, пока рабочий поток не завершится. Затем всплывающее окно отображается в течение <1 секунды, и отображается главная страница. Опять же, все это работает безупречно при отладке через VS 2010. </p>

Это все в эмуляторе, у меня еще нет устройства. Я только что заметил это сегодня, и по совпадению (?) Я только что обновил среду до 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 на 100 мс, чтобы запустить мою логику. Когда этот код выполняется, конструктор завершается, но таймер не тикает в течение 3-5 секунд. Очень странно, и только в симуляторе, когда он не подключен к отладчику.

1 Ответ

0 голосов
/ 12 августа 2011

Проблема здесь заключается в том, что вы никогда не присоединяете элемент управления Popup к визуальному дереву.Если честно, я понятия не имею, почему это будет работать и с подключенным отладчиком, но я ухожу от того, что я могу интерпретировать из вашего кода.

Я думаю, вам нужно добавитьэлемент управления Popup как элемент в XAML для MainPage, так что он присоединен к визуальному дереву.

Еще одна вещь, которую я хотел бы сказать, это то, что, возможно, стоит удалить весь код загрузки данных изконструктора и либо в переопределение для OnNavigatedTo, либо в обработчик для события Loaded.Вообще говоря, лучше сохранять конструкторы краткими и простыми, насколько это возможно (и да, я ценю, что для загрузки данных вы используете фоновый рабочий).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...