2015-07-21 3 views
0

Я пытаюсь реализовать прямоугольный теневой эффект в WPF, что-то вроде этого: https://css-tricks.com/multi-line-padded-text/Многоканальных проложенный текст в WPF

Тень должна следовать каждой строке текста, но это не должно иметь места между линий. Кроме того, тень будет иметь некоторую прозрачность, и это исключает добавление отдельного фона для встроенных прогонов. Я попробовал это, и там, где тени перекрываются, значения непрозрачности формируют более темный цвет.

Я исследовал до сих пор TextBox, TextBlock и RichTextBox. Я попытался изменить Run.Background или выбрать текст и изменить выделение переднего плана/фона. Без успеха ни один из них не делает именно то, что мне нужно.

В общем, что (я думаю) Мне нужна функция форматирования текста, которая позволила бы мне создать правильно обернутый текст из строки IN MEMORY с отдельными прогонами для каждой строки. После этого я смог узнать длину пикселя каждого прогона, добавить эти Runs вручную в RichTextBox или в TextBlock, с созданными вручную прямоугольниками позади них. К сожалению, когда я добавляю текст в TextBlock или RichTextBox, обертка применяется к самому запуску, а не к созданию отдельных прогонов для каждой завернутой строки.

ответ

0

Я не получаю никаких ответов, поэтому я пытаюсь ответить на свой вопрос. Моя основная проблема с TextBlock заключалась в том, что если бы я добавил слегка прозрачный цвет фона для встроенных объектов Run, они образовали более темный цвет, поскольку линии слегка перекрывались. Чтобы преодолеть эту проблему, я изменил Run Run на непрозрачный, и таким образом значения 100% непрозрачности не приведут к явно перекрывающимся линиям. Затем я изменил непрозрачность всего TextBlock до 80%, и я получил ожидаемый результат.

Вот пример XAML:

<TextBlock TextWrapping="Wrap" FontWeight="SemiBold" FontSize="23" FontFamily="Arial" TextBlock.LineHeight="24.65" 
      TextOptions.TextFormattingMode="Ideal" TextTrimming="CharacterEllipsis" LineStackingStrategy="BlockLineHeight" Opacity="0.8"> 
    <Run Background="#FFFF0000" Text="This text here" /> 
    <Run Background="#FFFF0000" Text="will be visible across" /> 
    <Run Background="#FFFF0000" Text="multiple lines" /> 
</TextBlock> 

Пожалуйста, обратите внимание, что стоимость LineHeight немного выше, чем значение FontSize. Это гарантирует, что между линиями не будет видимых промежутков.

Смежные вопросы