【问题标题】:How to make WPF text on Aero glass background readable?如何使 Aero 玻璃背景上的 WPF 文本可读?
【发布时间】:2011-05-06 02:26:57
【问题描述】:

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

如您在以下屏幕截图中所见,如果窗口 后面我的应用程序是黑暗的。

现在,Microsoft 应用程序(例如 Word)通过一种文本模糊处理来解决这个问题,如下图所示:

我听说我可以调用某种 Win32 API 来使其工作。然而,这对我来说只是道听途说,我没有任何事实可以证明这一点。


我尝试了一些不同的 WPF 特定的东西来近似 Word 的功能:

  • 在文本上放置阴影
  • 带有模糊效果的透明文本图像(而不是 TextBlock

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

【问题讨论】:

    标签: wpf .net-3.5 text


    【解决方案1】:

    您正在搜索的 Win32 函数是 DrawThemeTextEx。它有一个标志,允许您在背景中绘制带有白光/模糊的文本。 你可以在这里找到一个例子:C# Transparent GUI

    【讨论】:

    • 我看到这个方法的问题是它不能轻易地应用到现有的 Label 或 TextBlock 控件上,而无需借助 DrawThemeTextEx 手动绘制文本。
    【解决方案2】:

    我能够在没有 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 窗户后面是什么,它看起来都不错。

    【讨论】:

      【解决方案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>
      

      【讨论】:

      • 这是一个更清洁的解决方案。您还可以将&lt;Setter Property="Cursor" Value="Hand" /&gt; 添加到IsMouseOver 触发器,获取glassLink 的手形光标。
      猜你喜欢
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 2011-07-22
      相关资源
      最近更新 更多