Как сделать текст WPF на фоне Aero-стекла удобочитаемым?

У меня есть приложение WPF, которое рисует текст на фоне Aero glass. Проблема в том, что на основе того, что отображается в приложении позади, текст, нарисованный на стеклянном фоне, может стать трудно читаемым для прямого, невозможного для чтения.

Как вы можете видеть на следующем скриншоте, текстовые блоки Save, Undo и Redo становятся трудно читаемыми, если в окне позади мое приложение темное.

alt text

Теперь приложения Microsoft, такие как Word, решают эту проблему с размытым текстом, как вы можете видеть на следующем снимке экрана:

alt text

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


Я попробовал несколько разных WPF-специфических вещей, чтобы приблизиться к тому, что делает Word:

  • Тень тени в тексте
  • Прозрачные изображения текста с размытым эффектом (вместо TextBlock)

Никто из них не дает мне полезных результатов, все они выглядят довольно мутными. Кто-нибудь знает какой-либо метод WPF или Win32, который я мог бы использовать для рисования текста так, как это делает Microsoft на стекле (т.е. читаемый)?

Ответ 1

Мне удалось решить эту проблему без Win32 (требуется .NET 3.5).

 <Grid>
     <TextBlock Foreground="Black" HorizontalAlignment="Center" Margin="0,10,30,0" Text="Text that should be visible on Aero Glass">
         <TextBlock.Effect>
            <BlurEffect Radius="15" KernelType="Gaussian">                                                                    
            </BlurEffect>                                        
         </TextBlock.Effect>
      </TextBlock>
      <TextBlock HorizontalAlignment="Center" Foreground="White" Margin="0,10,30,0" Text="Text that should be visible on Aero Glass">
      </TextBlock>
 </Grid>

Этот код имеет эффект удвоения текста и размывание версии текста, которая находится дальше, Z-index мудрый. Работает как прелесть для меня.

Одно замечание:
Это кажется лучше всего, если цвет текста белый, а цвет размытия - черный. Это не выглядит так хорошо. Хорошая новость - это хорошо выглядит независимо от того, что стоит за окном Aero Glass.

Ответ 2

Функция Win32, которую вы ищете, - DrawThemeTextEx. Он имеет флаг, который позволяет рисовать текст с белым свечением/размытием в фоновом режиме. Здесь вы можете найти пример: С# Прозрачный графический интерфейс

Ответ 3

В случае, если кто-то ищет другой пример, попробуйте это, он включает в себя обратную поддержку для не стекла:

Использование:

Style="{StaticResource glassText}"

Входит в словарь ресурсов:

 <Style TargetType="TextBlock" x:Key="glassText">
    <Setter Property="Foreground" Value="Black" />
    <Style.Triggers>
        <Trigger Property="Foreground" Value="Black">
            <Setter Property="Effect">
                <Setter.Value>
                    <DropShadowEffect Color="White" BlurRadius="10" RenderingBias="Performance" ShadowDepth="0" Direction="0" />
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>
<Style TargetType="TextBlock" x:Key="glassLink" BasedOn="{StaticResource glassText}">
    <Setter Property="Foreground" Value="#FF0066CC" />
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Cursor" Value="Hand" />
            <Setter Property="TextDecorations" Value="Underline" />
        </Trigger>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Foreground" Value="{x:Static SystemColors.GrayTextBrush}" />
        </Trigger>
    </Style.Triggers>
</Style>