Страницы

Поиск по вопросам

понедельник, 17 июня 2019 г.

Как сделать нормальное поисковое поле?

Здравствуйте! У меня на фрейме есть AutoSuggestBox. На событие изменения текста навешен такой код:
private void AsbSearch_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args) { _timer.Stop(); _timer.Start(); }
Интервал у таймера равен 100 миллисекундам. Вот код, выполняемый при тике:
private void _timer_Tick(object sender, object e) { _timer.Stop(); if (string.IsNullOrEmpty(AsbSearch.Text) || AsbSearch.Text == " ") { return; } AsbSearch_QuerySubmitted(AsbSearch, null); }
Так вот, теперь все это плохо работает, поскольку поиск начинается несколько раз при вводе одного слова(быстрого ввода), причем первый поиск начинается примерно после ввода 3-4 символов. Как мне решить эту проблему? Можно конечно оставить начало поиска лишь на нажатие Enter-а или соответствующей кнопки, но это нежелательно.
Обновление
По сути мне надо выходить из AsbSearch_QuerySubmitted(AsbSearch, null); при изменении запроса. Но как это сделать? Пробовал использование булевой переменной с периодической проверкой, но нет, все точно также.


Ответ

А если с таймером, то так пытались или иначе?
private bool _searching = false;
...
private void _timer_Tick(object sender, object e) { _timer.Stop(); //У нас уже идет поиск, выходим, даже текст смотреть не будем: if (_searching) return;
if (string.IsNullOrEmpty(AsbSearch.Text) || AsbSearch.Text == " ") { return; } //Устанавливаем флаг того. что поиск начат: _searching = true; //Ищем: AsbSearch_QuerySubmitted(AsbSearch, null); //Поиск закончен.... _searching = false;
}
UPD: Вариант без таймера:
private string _PrevText = string.Empty; ... private void AsbSearch_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args) { //Текущий текст для поиска: string _CurrentText = AsbSearch.Text;
//Если предыдущий текст для поиска уже пустой, то можем искать текущий: if (string.IsNullOrEmpty(_PrevText)) { //Запоминаем в переменную предыдущего поиска значение для текущего поиска _PrevText = _CurrentText; //Ищем: AsbSearch_QuerySubmitted(AsbSearch, null); //После того, как поиск выполнен, очищаем переменную предыдущего поиска. _PrevText = string.Empty; } }

Комментариев нет:

Отправить комментарий