Страницы

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

понедельник, 29 октября 2018 г.

Навигация каретки в Text Formatter API

Используя Text Formatter API в WPF для проектирования простого текстового редактора, понадобилось добавить управление кареткой. В документации нашёл в описании класса TextLine методы GetNextCaretCharacterHit, GetPreviousCaretCharacterHit и GetBackspaceCaretCharacterHit. Но только вот все 3 метода - абстрактные. Примеров их реализации толком и не нашёл (разве что пару в исходниках .NET).
Может ли кто-нибудь объяснить/привести пример, что представляет из себя рабочая реализация этих методов и как они работают? Или же работу с кареткой можно реализовать другим способом? Буду рад любой помощи!
P.S.: Ранее я задал такой же вопрос на основном Stackoverflow, но там он уже затерялся. Так что если считаете этот вопрос полезным и голосуете за него здесь, то, пожалуйста, проголосуйте и там, если не сложно, ибо так вероятность, что на вопрос ответят, будет больше. Надеюсь, моя просьба не является некорректной.
UPD:
Кратко о решаемой задаче: Мне нужно добавить обычную навигацию каретки по тексту, т.е. управление ею клавишами перемещения курсора, её смещение при удалении и вводе текста (последние два пункта кое-как реализовал через методы GetCharacterHitFromDistance и GetDistanceFromCharacterHit, правда всё это как-то кривовато получилось, т.к. в случае смещения каретки при вводе текста я непосредственно создаю экземпляр CharacterHit, указывая в конструкторе вторым аргументом (который представляет trailingLength - что это, см. ниже) единицу: CharacterHit chHit = new CharacterHit(CurrentPosition, 1); (CurrentPosition здесь просто свойство типа int.
Что такое trailingLength в данном случае? В документации о trailingLength сказано: "В случае переднего края значение равно 0. В случае заднего края это значение равно количеству кодовых точек до следующей допустимой позиции курсора. " Почитав о том, что такое кодовые точки и о Юникоде в целом, всё становится понятно: большинство часто используемых символов состоят из одной кодовой точки. Пример составных - комбинирование символов с диакретическими знаками, например: \u0418\u0306 = Й в Юникоде (хотя \u0419 = Й также).
К слову, я так и не разобрался, как обеспечить корректную работу каретки (то бишь с использованием тех встроенных методов Get*CaretCharacterHit). Я пробовал хранить текущую позицию не как int-значение, а как CharacterHit, чтобы пользоваться теми методами (все они принимают текущий CharacterHit и возвращают новый). Но в итоге всё практически перестало адекватно работать.


Ответ

методы GetNextCaretCharacterHit, GetPreviousCaretCharacterHit и GetBackspaceCaretCharacterHit Может ли кто-нибудь объяснить/привести пример, что представляет из себя рабочая реализация этих методов и как они работают?
реализация GetPreviousCaretCharacterHit остальные реализации можно найти там же, на http://referencesource.microsoft.com

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

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