如何使Aero玻璃背景上的WPF文本可读?

时间:2010-11-06 18:46:39

标签: wpf .net-3.5 text

我有一个WPF应用程序,可以在Aero玻璃背景上绘制文本。问题在于,根据我的应用程序背后显示的内容,在玻璃背景上绘制的文本可能变得难以阅读而无法阅读。

正如您在以下屏幕截图中看到的那样,如果窗口保存,撤消重做文本块变得难以阅读>背后我的申请很黑。

alt text

现在,Microsoft等应用程序(例如Word)会在文本背后出现一种模糊现象,您可以在下一个屏幕截图中看到:

alt text

我听说我可以使用某种Win32 API调用来实现这一点。但是,就此而言,这只是传闻,我没有事实可以支持。


我尝试了一些不同的WPF特定的东西来估算Word的作用:

  • 在文字上投下阴影
  • 带有模糊的文字的透明图像(而不是TextBlock

这些都没有给我可用的结果,它们看起来都很糟糕。有没有人知道任何方法,WPF或Win32,我可以像微软在玻璃上那样绘制文字(即。可读)?

3 个答案:

答案 0 :(得分:8)

我能够在没有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窗口背后是什么,它看起来都很好。

答案 1 :(得分:3)

您要搜索的Win32函数是DrawThemeTextEx。它有一个标志,允许您在背景中绘制带有白色光晕/模糊的文本。 您可以在此处找到示例:C# Transparent GUI

答案 2 :(得分: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>