Укладка и задержка нескольких уведомлений об изменениях пользовательского интерфейса - PullRequest
1 голос
/ 25 июня 2009

Кто-нибудь обрабатывал такой сценарий в коде?

Пользователь что-то печатает в области ввода (скажем, в расширенном текстовом поле). Это приводит к возникновению нескольких событий TextChanged. Мы хотим захватить только последнее измененное событие, когда пользователь перестает печатать (то есть: без изменений в течение 5 секунд).

У кого-нибудь есть чистый фрагмент кода C # для этого?

Ответы [ 4 ]

4 голосов
/ 25 июня 2009

Создайте Timer с интервалом в пять (или что-то еще) секунд и, в вашем TextChanged событии, остановите таймер и запустите его снова. Затем переместите код обработчика в событие таймера Tick.

1 голос
/ 25 июня 2009

Хорошо, после использования System.Threading.Timer, как предложено SLaks , у меня есть очень простой фрагмент:

public sealed class CallBuffer : IDisposable
{

    private readonly TimeSpan _timeSpan;
    private readonly Timer _timer;

    public CallBuffer(Action call, TimeSpan timeSpan)
    {
        _timeSpan = timeSpan;
        _timer = new Timer(state => call());
    }

    public void Buffer()
    {
        _timer.Change(_timeSpan, TimeSpan.FromMilliseconds(-1));
    }

    void IDisposable.Dispose()
    {
        _timer.Dispose();
        GC.SuppressFinalize(this);
    }
}

Я что-то здесь упустил?

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

0 голосов
/ 25 июня 2009

Рассмотрите возможность использования события Leave, которое должно срабатывать, когда пользователь выходит из элемента управления.

Очевидно, это зависит от того, что делает элемент управления и чего ожидают пользователи.

0 голосов
/ 25 июня 2009

Я сам этим не пользовался, но эта статья выглядит многообещающе.

Я создал другой элемент управления, пейджер, если быть точным, и побежал в проблему. Проблема заключалась в том, что когда пользователь наберет, например, 100, чтобы перейти на эту страницу, я был перехват события TextChanged и его будет сначала перейти на страницу 1, а затем страницу 10, затем страница 100 (получите картина). Я не хотел, чтобы это случилось по нескольким причинам, но основной во-первых, потому что я не храню данные каждая страница в памяти, и она получает заполняется при выборе страницы с сервера SQL, поэтому я хотел устранить 3 запроса, когда один нужен для примера, упомянутого ранее.

Поэтому я решил, что вместо добавления кнопка "перейти" или "обновить" на мой пейджер контроль, я бы задержал TextBox Событие TextChanged так долго, как пользователь печатал это не будет запускать событие, пока он / она не был сделан (задержка порог был достигнут).

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