Захват ударов клавиатуры в C # - PullRequest
2 голосов
/ 10 мая 2009

HI

У меня следующая проблема - следующий текст находится в расширенном текстовом поле.

Мир сегодня [[чудесен]].

Если пользователь вводит две скобки перед словом «а» и вводит слово, как в случае слова «чудесное», слово в скобках, в данном случае «чудесное», должно измениться на ссылку (зеленого цвета).

У меня проблемы с получением последовательности нажатий клавиш, т.е. откуда мне знать, что пользователь ввел [[, чтобы я мог начать анализ остального текста, который следует за ним.

Я могу получить его, используя KeyDown, событие и список, но это не выглядит элегантно.

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

Спасибо, Sujay

Ответы [ 5 ]

5 голосов
/ 10 мая 2009

У вас есть два подхода, которые я могу придумать не по себе.

Во-первых, как вы предлагаете, поддерживать текущее состояние с помощью списка - этот ключ был в скобках? последний ключ был скобкой? - и обновление на лету.

Другой подход заключается в простой обработке события TextChanged, повторном сканировании текста для шаблона [[text-here]] и обновлении по мере необходимости.

Первый требует больше бухгалтерии, но для более длинного текста будет намного быстрее. Второй подход проще и, вероятно, может быть выполнен с приличным регулярным выражением, но он будет медленнее, когда ваш текст становится длиннее. Если вы знаете, что у вас есть какой-то верхний предел, например, 256 символов, то вы, вероятно, в порядке. Но если вы ожидаете романов, вероятно, не такая уж хорошая идея.

2 голосов
/ 10 мая 2009

Я бы порекомендовал Google'ing: «подсветку синтаксиса richtextbox», так много людей сделали это, и есть много закулисных возможностей, чтобы это работало.

Смею себе сказать, что КАЖДОЕ ОДНО простое решение имеет серьезные недостатки. Правильным способом было бы использовать некоторый элемент управления, который уже выполняет эту «подсветку синтаксиса» и распространяет ее на ваш синтаксис. Это также, скорее всего, самый простой способ.

Вы можете искать бесплатные элементы управления .net в Codeplex. ссылка

1 голос
/ 10 мая 2009

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

Это исключает необходимость сохранения состояния (т. Е. Списка). Как только будет напечатан второй], блок мгновенно изменится на ссылку.

0 голосов
/ 11 мая 2009

(Извините, у вас недостаточно репутации, чтобы добавлять комментарии, поэтому добавьте новый ответ). По предложению jeffamaphone я бы обработал событие TextChanged и каждый раз заново сканировал текст, но чтобы сохранить постоянную стоимость, просто отсканируйте несколько символов перед текущей позицией курсора вместо чтения всего текста.

Попытка перехвата нажатий клавиш и поддержания внутреннего состояния - плохой подход - очень легко для вашей идеи того, что произошло, не синхронизировано с элементом управления, который вы отслеживаете, и возникают странные проблемы. (и как вы обрабатываете щелчки? Alt-tab? Вставка? клавиши со стрелками? Другие приложения, привлекающие внимание? Слишком много особых случаев, о которых нужно беспокоиться ...)

0 голосов
/ 10 мая 2009

Ведение списка будет довольно сложным, я думаю. Что делать, если пользователь вводит символ «[», щелкает где-то еще в тексте, а затем снова вводит символ «[». Затем пользователь набрал два последовательных символа '[', но в совершенно разных частях текста. Также вы можете захотеть обрабатывать текст, вставленный из буфера обмена.

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

...