Проходя через элемент управления Pivot очень быстро вылетает - PullRequest
2 голосов
/ 21 сентября 2011

У меня есть элемент управления Pivot и кнопка, которая делает selectedIndex ++, и когда selectedIndex прошел последнюю запись, он откроет окно сообщения, спрашивающее пользователя, хотят ли они опросить.

Но во время тестирования, если вы спамите кнопку, при открытии MessageBox возникнет ошибка 0x8000ffff.

Как мне предотвратить это? это как-то связано с тем, что поток пользовательского интерфейса слишком занят или продолжает перемещать стержень? событие кнопки продолжает выполняться после того, как я пытаюсь выйти из страницы?

это то, что код, который делает selectedIndex ++

void gotoNextQuestion()
{
    if (quizPivot.SelectedIndex < App.settings.currentTest.Questions.Count() - 1)
    {
        //xScroll -= scrollAmount;
        //moveBackground(xScroll);

        if (!stoppedPaging)
        {
            quizPivot.SelectedIndex++;
        }

        //App.PlaySoundKey("next");
    }
    else
    {
        if (App.settings.testMode == App.TestModes.TrainingRecap)
        {
            MessageBoxResult result;

            if (countAnsweredQuestions() == App.settings.currentTest.Questions.Count())
            {
                stoppedPaging = true;
                result = MessageBox.Show("You have reviewed every training question, would you like to go back to the main menu?", "Training Over", MessageBoxButton.OKCancel);
                stoppedPaging = false;
                if (result == MessageBoxResult.OK)
                {
                    positionableSpriteRadioButton.IsAnswered -= new Action<bool>(Answers_IsAnsweredCompleted);
                    spriteRadioButton.IsAnswered -= new Action<bool>(Answers_IsAnsweredCompleted);
                    App.settings.currentTest = null;
                    NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
                    return;
                }
            }
        }
        else
        {
            MessageBoxResult result;

            if (countAnsweredQuestions() == App.settings.currentTest.Questions.Count())
            {
                stoppedPaging = true;
                result = MessageBox.Show("You have answered all of the questions, are you sure you want to finish?", "Are you sure you want to finish?", MessageBoxButton.OKCancel);
                stoppedPaging = false;
            }
            else
            {
                checkFinishConditions();
            }
        }

        quizPivot.SelectedIndex = 0;
        //App.PlaySoundKey("begin");
    }

    App.settings.currentTest.currentQuestion = quizPivot.SelectedIndex;
}

1 Ответ

2 голосов
/ 21 сентября 2011

Ну, одно можно сказать наверняка

positionableSpriteRadioButton.IsAnswered -= new Action<bool>(Answers_IsAnsweredCompleted); 

Это не сработает. Вы создаете новое Действие каждый раз. Таким образом, ничто не будет иметь такой же ссылочный идентификатор, и, следовательно, ничто не будет удалено.

Вместо этого вы должны удалить Action<bool> и просто подписаться / отписаться с помощью

positionableSpriteRadioButton.IsAnswered -= Answers_IsAnsweredCompleted;

А при подписке

positionableSpriteRadioButton.IsAnswered += Answers_IsAnsweredCompleted;

Таким образом, вы действительно можете удалить его снова.

Но я бы порекомендовал вам не использовать опору для этого типа "мастера". Это злоупотребление контролем и очень плохое взаимодействие с пользователем.

Кроме того, то, что вы переходите на другую страницу, не означает, что код перестает работать. Весь код в том же выражении выполняется, если вы не добавите оператор return после вызова NavigationService.Navigate.

Кроме того, всегда проверяйте, что Navigation находится в потоке пользовательского интерфейса, заключая все вызовы в NavigationService.Navigate в вызов Dispatcher.BeginInvoke.

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