Подсветка синтаксиса в реальном времени в RichTextBox - PullRequest
1 голос
/ 16 сентября 2011

В настоящее время я разрабатываю очень простое приложение с очень простой подсветкой синтаксиса в RichTextBox.

Работает почти нормально. Что я делаю:

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

Этот метод запускается при каждом событии KeyUp. И это делает много мерцания.

Итак, мой вопрос: как я могу тонко выделить текст, который я печатаю, без мерцания? Этот редактор никогда не будет содержать тысячи строк текста, возможно, около ста максимум, поэтому мне пока не нужно очень оптимизированное решение.

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

Ответы [ 2 ]

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

Я сделал так, чтобы подождать, пока печать не остановится, а затем сделать выделение один раз.Это было основной логикой:

  • с каждым ключом (или тестовым обменом и т. Д.), Установите время «последнего изменения» и поставьте в очередь фоновую задачу (QueueUserWorkItem)

  • В WaitCallback для фонового потока подождите 750 мс через System.Threading.Thread.Sleep().Когда сон закончится, проверьте время «последнего изменения».Это меньше, чем 750 мс назад?Если это так, пользователь все еще печатает, так что ... ничего не поделаешь.Просто выйдите из метода.

  • если время последнего изменения больше 750 мс назад, то пользователь прекратил печатать.Другими словами, за последние 750 мс реального времени никаких изменений не произошло.Итак, сделайте выделение.Помните, что вам нужно делать обновления пользовательского интерфейса в потоке пользовательского интерфейса.Это означает проверку this.InvokeRequired в приложении WinForms или this.Dispatcher.CheckAccess() в WPF перед применением форматирования.

0 голосов
/ 16 сентября 2011

Я решил что-то попробовать, и это сработало потрясающе!

Я выделяю одну строку за раз. Поэтому, когда срабатывает keyUp, я анализирую только выбранную строку. Так что нет мерцания!

И при запуске я создал метод HighlightLines (), который перебирает строки и вызывает мой метод HighlightLine (lineIndex).

Я попытаюсь смешать свое решение с Cheeso, и я думаю, что это сделает что-то потрясающее!

Спасибо

...