2009-05-10 3 views
2

HI,Захват клавиатурных штрихов в C#

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

Мир [[замечательный]] сегодня.

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

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

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

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

Спасибо, Sujay

ответ

5

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

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

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

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

+0

Если ссылки не могут быть многострочными (часто это бывает) Не нужно сканировать всю строку, если вы сохраняете копию строки, хранящейся в строках. Затем каждую строку можно разобрать отдельно, и она не масштабируется по общему размеру строки. –

+0

Я уже делал событие KeyDown и фиксировал скобки, но я не думаю, что это приличная программа Не существует какого-либо подхода с шаблонами проектирования, которые могут решить эту проблему. Например, я думаю об этом. [[замечательный]] текст - это объект. Когда я сталкиваюсь с фигурными скобками, я делегирую его функции, например SetFormatStyle (текст), которая делает это нужным. –

0

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

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

1

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

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

2

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

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

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

0

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

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