FlowDocument теряет ClearType в дочерних элементах при помещении в окно с пользовательским стеклом - PullRequest
5 голосов
/ 08 марта 2011

Таким образом, новый рендеринг текста WPF 4 выглядит великолепно, но для включения эффекта аэростекла в окне необходимо изменить фон на прозрачный, что, конечно, отключает рендеринг ClearType.

Использование предоставленного RenderOptions.ClearTypeHint= Enabled позволяет назначить дочерние элементы для включения рендеринга ClearType с этой точки дерева.Я нашел несколько других тем, в которых говорится о том, как это сделать для ScrollViewer, который используется внутри RichTextBox и FlowDocumentScrollViewer, и создание собственного стиля действительно исправляет его, так что мой FlowDocument снова получает рендеринг ClearType.

Однако этоприменяется только к абзацам верхнего уровня в FlowDocument.Если я добавлю плавающие элементы или рисунки, или таблицу, любой текст внутри них снова станет необъяснимо серым.Я знаю, что виноват стеклянный эффект, так как отключение его приводит к повторному включению рендеринга ClearType.

Я просматривал визуальное дерево с помощью Snoop, но как основной контент (который отображается правильно), так и суб-контент (которыйв градациях серого) имеют похожие иерархии элементов, к которым я не могу прикрепить RenderOptions.ClearTypeHint.

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

Ответы [ 2 ]

3 голосов
/ 12 марта 2011

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

После некоторого поиска в отражателе я обнаружил, что при использовании расширенного текстаAPI форматирования для получения текста и его рендеринга в контекст рисования, флаги RenderOption по существу игнорируются, поскольку система рисования знает из корневого визуала (окна), что прозрачность включена.Как только это произойдет, все флаги RenderOptions в мире не вернут ClearType.

Я случайно наткнулся на обходной путь.Если у вас есть доступ к DrawingContext и вы выполняете низкоуровневый текстовый рендеринг самостоятельно, вы можете сделать DrawRectangle позади текста с заливкой, и ClearType будет снова включен.Я предполагаю, что это единственный способ для рендерера быть уверенным в том, что у него есть надлежащий фон для рисования.

Итак, в общем, вам нужно сделать свой собственный текст для рисования, и дополнительно вам нужно явно нарисоватьфон, использующий тот же DrawingContext за вашим текстом, чтобы ClearType правильно отображался.

0 голосов
/ 08 марта 2011

Я знаю, что это может быть утомительно, но вы пытались установить общие стили, например, так:

    <Style TargetType="Paragraph">
        <Setter Property="RenderOptions.ClearTypeHint" Value="Enabled"/>
    </Style>
...