Страницы

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

вторник, 17 декабря 2019 г.

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

#c_sharp #net #wpf #редактор_текста


Используя 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 и возвращают новый). Но в итоге всё практически
перестало адекватно работать.
    


Ответы

Ответ 1



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

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

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