Активация до надлежащей деактивации WP7 - PullRequest
1 голос
/ 01 августа 2011

В моем приложении я разрешаю пользователю выходить на рынок по разным причинам. При загрузке торговой площадки, если пользователь нажимает кнопку «Назад» очень быстро, он пытается вернуться к сохраненным заявленным приложениям. Все мои данные из iso-storage и т. Д. Загружаются просто отлично, но экран завис. У меня есть разные панели приложений для различных сводных элементов, и когда я выполняю движение смахиванием, я вижу, что панель приложения меняется, поэтому я знаю, что приложение отзывчиво.

Основная проблема в том, что экран застрял там, где пользователь изначально запустил задачу Marketplace. Я понимаю, что в этом крайнем случае мои конструкторы App и Page не запускаются, а инициируемые события находятся при переходе из приложения, деактивации приложения, активации приложения и при переходе к.

Я подумал, что мог бы использовать логическое значение, чтобы в основном охватить случай, когда запускается рыночная задача, чтобы я мог перезагрузить контекст данных во включенном методе и установить его в свою модель представления. Однако экран все еще заморожен.

Любая помощь по этому вопросу с благодарностью, Спасибо

Редактировать: вот соответствующий код

private void Application_Activated(object sender, ActivatedEventArgs e)
{
    if (!App.ViewModel.IsDataLoaded)
    {
        App.ViewModel.LoadData();
    }

    DetermineIsTrial();
}

private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
    if (playerController.chapterPlayer != null)
    {
        var store = new PersistentDataStorage();
        store.Backup(StringResource.ChapterPosition, playerController.chapterPlayer.Position);
        store.Backup(StringResource.ChapterUriString, playerController.chapterPlayer.Source.OriginalString);
        store.Backup(StringResource.NaturalDuration, playerController.chapterPlayer.NaturalDuration.TimeSpan);
    }
}

Главная страница XAML:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    App.viewIdentifier = StringResource.MainPageView;

    if (App.firstTimeLoading == false && PivotBackground.SelectedItem != SuggestedPivotItem)
    {
        BuildApplicationBar();
    }
    else if (PivotBackground.SelectedItem == SuggestedPivotItem)
    {
        BuildMarketPlaceApplicationBar();
    }

    if (App.firstTimeLoading == true)
    {
        BuildApplicationBar(); //builds the application bar

        //Restore the state from tombstone and set the audioplayer.
        App.playerController = new PlayerButtonsController();
        App.playerController.SetMediaPlayer(App.MainAudioPlayer);
        RestoreState();
        ResourceDictionary appResourceList = App.Current.Resources;
        App.firstTimeLoading = false;
        //default source for chapter position
        App.AudioMgr.SetChapterSource(0);
    }
}

Дополнительные методы:

private void RestoreState()
{
    var store = new PersistentDataStorage();
    playerWasWhere = store.Restore<TimeSpan>(StringResource.ChapterPosition);
    naturalDuration = store.Restore<TimeSpan>(StringResource.NaturalDuration);
    currentAudioFile = store.Restore<String>(StringResource.ChapterUriString);
    SetAudioListScrollPosition();
    App.playerController.SetPositionFromIsoStorage(currentAudioFile, playerWasWhere, naturalDuration);
}

public void LoadData()
{

    CreateAudioPlayerGUIfromChapterList();
    CreateAboutMenuGUIfromExtrasData();
    CreateQuotesMenuGUIfromExtrasData();
    this.IsDataLoaded = true;
}

private void CreateAudioPlayerGUIfromChapterList()
{
    int numberOfChapters = 0;
    for (int i = 0; i < App.AudioMgr.Parts.Count; i++)
    {
        ObservableCollection<ItemViewModel> tempObservableCollection = new ObservableCollection<ItemViewModel>();
        for (int j = 0; j < App.AudioMgr.Parts[i].NumberOfChapters; j++)
        {
            tempObservableCollection.Add(new ItemViewModel()
            {
                LineOne = ProcessTitle(App.AudioMgr.Chapters[numberOfChapters + j].Title),
                LineTwo = App.AudioMgr.Chapters[numberOfChapters + j].StatusMessage,
                ItemAlpha = 0.0,
                ChapterForeground = ChapterInfo.StatusColor[(int)App.AudioMgr.Chapters[numberOfChapters + j].Status],
                Progress = 0,
                Width = 0,
                UserColorTheme = App.accentBrush,
                PlayIconVisible = Visibility.Collapsed,
                ChapterDurationProgressBarAdjacent = StringResource.Space,
                ContainingPart = i,
                MediaStateImageSource = StringResource.KJIcons + App.themeDir + StringResource.AppBarSpeaker
            });
        }
        numberOfChapters += App.AudioMgr.Parts[i].NumberOfChapters;

        //no parts header doesn't need spacing or border since its the first header.
        if (i == 0 && App.AudioMgr.Parts[i].Title == "")
        {
            Parts.Add(new PartsViewModel()
            {
                PartsHeader = StringResource.Space,
                ChapterForeground = App.defaultForeground,
                ChaptersInPart = tempObservableCollection,
                PartsBackgroundBrush = App.partsBackgroundBrush,
                PartsHeaderHeight = 0,
                PartsBorderThickness = new Thickness(0)
            });
        }
        //parts header needs spacing and border
        else if (App.AudioMgr.Parts[i].Title != "")
        {
            Parts.Add(new PartsViewModel()
            {
                PartsHeader = App.AudioMgr.Parts[i].Title,
                ChapterForeground = App.defaultForeground,
                ChaptersInPart = tempObservableCollection,
                PartsBackgroundBrush = App.partsBackgroundBrush,
                PartsHeaderHeight = double.NaN,
                PartsBorderThickness = new Thickness(0,0,0,2)
            });
        }
        else
        {
            Parts.Add(new PartsViewModel()
            {
                PartsHeader = StringResource.Space,
                ChapterForeground = App.defaultForeground,
                ChaptersInPart = tempObservableCollection,
                PartsBackgroundBrush = App.partsBackgroundBrush,
                PartsHeaderHeight = 0,
                PartsBorderThickness = new Thickness(0)
            });
        }
    }
}

private void CreateAboutMenuGUIfromExtrasData()
{
    int list_count = 0;

    for (int i = 0; i < 3; ++i)
    {
        switch (i)
        {
            //Evaluate number of Authors
            case 0:
                list_count = DictionaryIterator(App.Parser.AboutAuthorsArrayList);
                if (list_count == 1)
                {
                    this.About.Add(new ItemViewModel() { LineOne = StringResource.AboutAuthor }); //for one author
                }
                else if (list_count > 1)
                {
                    this.About.Add(new ItemViewModel() { LineOne = StringResource.AboutAuthors }); //for more than one author
                }
                break;

             //Evaluate number of books (should only be one)
            case 1:
                list_count = DictionaryIterator(App.Parser.AboutBookArrayList);
                if (list_count > 0)
                    this.About.Add(new ItemViewModel() { LineOne = StringResource.AboutBook });
                break;

            //Evaluate number of Readers
            case 2:
                list_count = DictionaryIterator(App.Parser.AboutNarratorsArrayList);
                if (list_count == 1)
                {
                    this.About.Add(new ItemViewModel() { LineOne = StringResource.AboutReader }); //for one reader
                }
                else if (list_count > 1)
                {
                    this.About.Add(new ItemViewModel() { LineOne = StringResource.AboutReaders}); //for more than one reader
                }
                break;
        }
    }
}

private void CreateQuotesMenuGUIfromExtrasData()
{
    int list_count = 0;

    for( int i = 0; i < 6; ++i )
    {
        switch( i )
        {
            case 0:
                list_count = DictionaryIterator(App.Parser.QuotesAuthorAboutArrayList);
                if (list_count == 1)
                    this.Quotes.Add(new ItemViewModel() { LineOne = StringResource.QuotesAboutAuthor});
                else if(list_count > 1)
                    this.Quotes.Add(new ItemViewModel() { LineOne = StringResource.QuotesAboutAuthors });
                break;

            case 1:
                list_count = DictionaryIterator(App.Parser.QuotesAuthorFromArrayList);
                if (list_count == 1)
                    this.Quotes.Add(new ItemViewModel() { LineOne = StringResource.QuotesFromAuthor });
                else if (list_count > 1)
                    this.Quotes.Add(new ItemViewModel() { LineOne = StringResource.QuotesFromAuthors});
                break;

            case 2:
                list_count = DictionaryIterator(App.Parser.QuotesBookAboutArrayList);
                if (list_count > 0)
                    this.Quotes.Add(new ItemViewModel() { LineOne = StringResource.QuotesAboutBook });
                break;

            case 3:
                list_count = DictionaryIterator(App.Parser.QuotesBookFromArrayList);
                if (list_count > 0)
                    this.Quotes.Add(new ItemViewModel() { LineOne = StringResource.QuotesFromBook });
                break;

            case 4:
                list_count = DictionaryIterator(App.Parser.QuotesReaderAboutArrayList);
                if (list_count == 1)
                    this.Quotes.Add(new ItemViewModel() { LineOne = StringResource.QuotesAboutReader });
                else if (list_count > 1)
                    this.Quotes.Add(new ItemViewModel() { LineOne = StringResource.QuotesAboutReaders });
                break;

            case 5:
                list_count = DictionaryIterator(App.Parser.QuotesReaderFromArrayList);
                if (list_count == 1)
                    this.Quotes.Add(new ItemViewModel() { LineOne = StringResource.QuotesFromReader });
                else if (list_count > 1)
                    this.Quotes.Add(new ItemViewModel() { LineOne = StringResource.QuotesFromReaders });
                break;
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 01 августа 2011

В основном это происходит потому, что ваш код блокирует поток пользовательского интерфейса. И причина, по которой он блокируется, заключается в том, что способ замедлить.

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

Лично мне не нравится идея связать модель представления с вашим классом приложения, и я также думаю, что бессмысленно использовать Application_Activated/Deactivated для надгробия, а не обрабатывать постоянство в OnNavigatedFrom и OnNavigatedTo.

Я думаю, что будет трудно дать точный ответ о том, что является причиной проблемы, но сейчас я полагаю, что вы используете процесс надгробия для воссоздания пользовательского интерфейса вместо того, чтобы позволить UIThread сам делает работу.

Вся информация о том, что вы генерируете пользовательский интерфейс в C #, настолько ошибочна, насколько это возможно. XAML создан для этого, и он действительно хорош в том, для чего он создан.

1 голос
/ 01 августа 2011

Вы уверены, что восстанавливаете состояние только в том случае, если код действительно был захоронен?

Я подозреваю, что вы возвращаетесь к своему приложению до того, как оно будет захоронено, но все еще пытаетесь восстановить состояние.То, что вы сохраняете и как его восстанавливаете, определит, как вы можете проверить, нужно ли его восстанавливать.Проверка на нулевое значение или, если нет, значение defautl, вероятно, является самым простым способом.
Вы также можете получить лучшую производительность, если сохраните только состояние того, что вам абсолютно необходимо.Вам также следует попытаться сохранить состояние в событии OnNavigatingFrom, а не в событии OnNavigatedFrom.

Что и как вы сохраняете в IS?
Почему бы не использовать объект Page.State?

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