Можно ли выборочно покрасить обтекатель TextBlock в Silverlight / WPF - PullRequest
5 голосов
/ 13 марта 2010

Например, если у меня есть TextBlock:

"Lorem ipsum dolor sit amet, организатор adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, упражнение в духе quul nostrud ullamco Laboris nisi ut aliquip ex ea Коммодорное наследство. представьте, что у вас есть волют, велит, esse cillum, долоре, ЕС, fugiat, nulla pariatur. Excepteur, sint, occaecat, cupidatat, не прорицатель, иск в виновном, вызывающий тревогу, моллит, аним, то есть рабочая сила. "

Я хочу первые 10% этого TextBlock, чтобы цвет шрифта был красным, а остальные - зеленым.

Это, возможно, означает, что он будет окрашивать "Lorem ipsum dolor sit amet, contectetur adipisici" и часть "n". По сути, пиксельная окраска шрифта вместо символьной.

Другое важное поведение заключается в том, что процент учитывает перенос, в том случае, если 50% содержимого TextBlock окрашено, это должно означать, что 50% текста в порядке чтения является цветным, а не первая половина блока.

Например, это похожий вопрос (с правильными ответами), но в отношении Label / TextBlocks без переноса: Можно ли выборочно окрашивать метки в Silverlight?

Ответы [ 3 ]

4 голосов
/ 13 марта 2010

Вы можете использовать Runs, чтобы отделить ваш текст. В этом смысле вы можете изменять фон каждого запуска, например ...

    <TextBlock>
        <Run Background="Red">
            Republican
        </Run>
        <Run Background="Blue">
            Democrat
        </Run>
    </TextBlock>
3 голосов
/ 13 марта 2010

Я не верю, что это возможно по пикселям (по крайней мере, без измерения текста и использования одного из методов из связанного вопроса построчно). Это можно сделать посимвольно, используя объект Run:

<TextBlock FontSize="24" TextWrapping="Wrap">
  <Run Foreground="Red">Lorem ipsum dolor sit amet, consectetur</Run>
  adipisicing elit, sed do eiusmod tempor incididunt ut labore et
  dolore magna aliqua. Ut enim ad minim veniam...
</TextBlock>

Если текст динамический, вам нужно написать код для разбиения текста на два прогона (и назначить их в коллекцию TextBlock.Inlines), но не должно быть слишком сложно инкапсулировать это в пользовательский управление.

2 голосов
/ 13 марта 2010

Насколько мне известно, в этом сценарии нет встроенной поддержки. Я предполагаю, что в WPF вам придется написать свой собственный TextFormatter. В Silverlight вам, возможно, придется сделать что-то ужасное, например, рендеринг в растровое изображение в памяти и использование манипуляции с изображением, чтобы найти пиксели для изменения, а затем нарисовать растровое изображение на экране. Eugh.

...