Привет! Я создал контрол на основе TextBlock с возможностью подсветки текста. Для начала приведу пример его использования, затем опишу, как он создавался.
Пример использования контрола
<local:HighlightTextBlock TextWrapping="Wrap">
<local:HighlightTextBlock.HighlightRules>
<local:HighlightRule HightlightedText="{Binding Filter, Source={x:Reference thisWindow}}">
<local:HighlightRule.Highlights>
<local:HighlightBackgroung Brush="Yellow"/>
<local:HighlightForeground Brush="Black"/>
</local:HighlightRule.Highlights>
</local:HighlightRule>
</local:HighlightTextBlock.HighlightRules>
<Run FontWeight="Bold">Property:</Run>
<Run Text="{Binding Property}"/>
</local:HighlightTextBlock>
Начало разработки
Потребовалось мне подсветить текст в TextBlock, введенный в строку поиска. На первый взгляд задача показалась простой. Пришло в голову разделить текст на 3 элемента Run, которые бы передавали в конвертер весь текст, строку поиска и свое положение (1/2/3). Средний Run имеет Backgroung.
Не успел я приступить к реализации, как пришла в голову мысль, что совпадений может быть несколько. А значит такой подход не подходит.
Была еще мысль формировать Xaml «на лету», парсить его при помощи XamlReader и кидать в TextBlock. Но эта мысль тоже сразу отвалилась, потому что попахивает.
Следующей (и окончательной) идеей стало создать систему правил подсветки и прикрутить ее к TextBlock. Тут 2 варианта: свой контрол с блэкджеком и девочками на основе TextBlock или AttachedProperty. После недолгих раздумий, я решил, что все таки лучше создать отдельный контрол, потому что функционал подсветки может наложить некоторые ограничения на функциональность самого TextBlock, а разруливать это проще, если от него унаследоваться.
Читать полностью »