Это немного абстрактный вопрос, за который я прошу прощения.Я не обязательно ищу конкретное проверенное решение, а скорее несколько предложений, с которыми я могу поэкспериментировать, чтобы найти то, которое работает лучше всего.Все предложения приветствуются - чем разнообразнее и креативнее, тем лучше.
Вот проблема:
У меня есть Silverlight TextBlock
, который содержит абзац переноса текста.Он может содержать несколько прогонов с различным форматированием, включая шрифты разных размеров.Он может быть выровнен по левому, правому, центру или по правому краю и может содержать прогоны, использующие текстовый поток справа налево.Мне нужно быть в состоянии обнаружить символ под указателем мыши.В WPF я мог бы легко решить эту проблему, используя метод GetPositionFromPoint
, но, поскольку этот метод не существует в Silverlight, мне нужен творческий обходной путь.
Один из подходов, которые я попытался с разумным успехом, - это сломатьтекст на отдельные слова и создайте TextBlock
для каждого из них.Отобразив их в WrapPanel
, я могу определить начальную позицию каждого слова и, таким образом, сузить зону проверки попадания.Поиск фактического целевого символа - это вопрос построения целевого слова, символ за символом, до тех пор, пока его ширина не достигнет положения мыши.
Хотя моя экспериментальная методика работает, у нее есть два недостатка.Во-первых, это производительность, поскольку рендеринг большого числа отдельных TextBlock
экземпляров в WrapPanel
обходится дорого.Вторая проблема заключается в том, что мой алгоритм переноса строк (грубо основанный на пробелах и дефисах) может не совпадать с тем, который использовался в реальном TextBlock
, используемом в пользовательском интерфейсе.Только что прочитав Алгоритм разрыва строки Unicode , я понимаю, что это целый предмет сам по себе.Я не хочу рисковать дизайном, который ломается при определенных условиях содержания абзаца
В идеале я хотел бы найти метод, который позволяет мне измерять непосредственно по отношению к основному TextBlock
, но я приветствую любые новаторские предложения,как бы странно они ни казались.
Большое спасибо, Тим