Silverlight C # - Как задержать прохождение цикла до завершения события? - PullRequest
2 голосов
/ 25 января 2011

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

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

Как сделать паузу в цикле, чтобы он ожидал выбора, а затем возобновил его?

Вот код для цикла:

  foreach(string checkedWord in articleWords)
        {
            bool success = _spellChecker.CheckWord(checkedWord);
            List<string> suggest;

            if (!success)
            {
                suggest = _spellChecker.GetSuggestions(checkedWord);
                SpellChecklistBox.Items.Clear();

                foreach (string s in suggest)
                {

                   SpellChecklistBox.Items.Add(new ListBoxItem() { Content = s });

                }
                SpellCheckerPopup.IsOpen = true;
                SpellChecklistBox.Items.Add(new ListBoxItem() { Content = "          ----------------------" });
                SpellChecklistBox.Items.Add(new ListBoxItem() { Content = "Ignore" });
            }


        }

Когда отображается SpellCheckerPopup, у меня есть триггер события в списке на SelectionChange.

По сути, мне нужно как-то приостановить цикл, а затем, когда событие SelectionChange делает свое дело, возобновить цикл.

Заранее спасибо!

-Sootah

Ответы [ 2 ]

1 голос
/ 25 января 2011

Если я не ошибаюсь, в настоящее время вы собираетесь:

(1) Проверить каждое слово в цикле

(2) Пауза цикл приобнаружена ошибка и появляется окно с предложением

(3) Пользователь выбирает слово с предложением и резюме цикл

Я думаю, что будет лучше и проще, если решение будет:

(1) Проверить слово из первого

(2) Выйти из метода проверки с флагом ошибки и сохранить позицию в переменной, открыть окно с подсказкой

(3) Пользователь выбирает слово предложения, и когда пользователь подтвердил предложение (например, нажав OK в окне предложения), снова запустите CheckWordMethod из сохраненной позиции

(4) До шага (2)) завершается без флага ошибки, что означает, что все слова теперь верны (но убедитесь, что в ходе всего процесса пользователи могут изменять слова только в соответствии с вашим окном предложения)

0 голосов
/ 27 января 2011

@ Самый умный : Ваш ответ направил меня в правильном направлении; на самом деле в итоге узнал новый тип данных из этого! Никогда раньше не использовал Очередь. (Это сделало АД намного проще, чем отслеживать, где в массиве я находился, как я впервые подумал, что мне придется ..:)

В любом случае, я приму ваш ответ, но вот код, который я закончил: (Фактическая замена слова в текстовом поле, который я еще не реализовал.)

private void btnSpelling_Click(object sender, RoutedEventArgs e)
    {

        SpellChecklistBox.Items.Clear();

        string[] articleWordsArray = txtArticle.Text.Split(' ');

        foreach (string word in articleWordsArray)
        {
            articleWords.Enqueue(word);

        }

        CorrectWord();


    }

private void SpellChecklistBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        SpellCheckerPopup.IsOpen = false;
    }

private void SpellCheckerPopup_Closed(object sender, EventArgs e)
    {
        CorrectWord();
        SpellChecklistBox.Items.Clear();
    }

Queue<string> articleWords = new Queue<string>();


    private void CorrectWord()
    {
        if (articleWords.Count() > 0)
        {
            string checkedWord = articleWords.Dequeue();
            bool success = _spellChecker.CheckWord(checkedWord);
            List<string> suggest;

            if (!success)
            {
                suggest = _spellChecker.GetSuggestions(checkedWord);


                foreach (string s in suggest)
                {
                    SpellChecklistBox.Items.Add(new ListBoxItem() { Content = s });
                }

                SpellCheckerPopup.IsOpen = true;
                SpellChecklistBox.Items.Add(new ListBoxItem() { Content = "          ----------------------" });
                SpellChecklistBox.Items.Add(new ListBoxItem() { Content = "Ignore" });
                SpellCheckerPopup.IsOpen = true;
            }
        }
    }

Это все довольно прямолинейно благодаря типу Queue. Когда кнопка орфографии нажата, она загружает TextBox в массив, а затем я перебираю массив, чтобы поместить элементы в очередь articleWords, после чего он вызывает CorrectWord (). CorrectWord () затем загружает соответствующий список после удаления из articleWords и во всплывающем окне. Закрытое событие очищает ListBox и вызывает CorrectWord (), который будет возвращать всплывающее окно до тех пор, пока не останется больше слов, которые нужно исправить. :)

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