#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
Комментариев нет:
Отправить комментарий