Как выполнить проверку отдельных символов в текстовом блоке Silverlight - PullRequest
2 голосов
/ 17 сентября 2010

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

Вот проблема:

У меня есть Silverlight TextBlock, который содержит абзац переноса текста.Он может содержать несколько прогонов с различным форматированием, включая шрифты разных размеров.Он может быть выровнен по левому, правому, центру или по правому краю и может содержать прогоны, использующие текстовый поток справа налево.Мне нужно быть в состоянии обнаружить символ под указателем мыши.В WPF я мог бы легко решить эту проблему, используя метод GetPositionFromPoint, но, поскольку этот метод не существует в Silverlight, мне нужен творческий обходной путь.

Один из подходов, которые я попытался с разумным успехом, - это сломатьтекст на отдельные слова и создайте TextBlock для каждого из них.Отобразив их в WrapPanel, я могу определить начальную позицию каждого слова и, таким образом, сузить зону проверки попадания.Поиск фактического целевого символа - это вопрос построения целевого слова, символ за символом, до тех пор, пока его ширина не достигнет положения мыши.

Хотя моя экспериментальная методика работает, у нее есть два недостатка.Во-первых, это производительность, поскольку рендеринг большого числа отдельных TextBlock экземпляров в WrapPanel обходится дорого.Вторая проблема заключается в том, что мой алгоритм переноса строк (грубо основанный на пробелах и дефисах) может не совпадать с тем, который использовался в реальном TextBlock, используемом в пользовательском интерфейсе.Только что прочитав Алгоритм разрыва строки Unicode , я понимаю, что это целый предмет сам по себе.Я не хочу рисковать дизайном, который ломается при определенных условиях содержания абзаца

В идеале я хотел бы найти метод, который позволяет мне измерять непосредственно по отношению к основному TextBlock, но я приветствую любые новаторские предложения,как бы странно они ни казались.

Большое спасибо, Тим

1 Ответ

2 голосов
/ 17 сентября 2010

Вместо этого используйте RichTextBox, у которого есть метод GetPositionFromPoint.

...