Как сделать текст 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>