代码之家  ›  专栏  ›  技术社区  ›  Rob

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

  •  10
  • Rob  · 技术社区  · 14 年前

    后面 我的应用程序中,在玻璃背景上绘制的文本会变得很难阅读,完全不可能阅读。

    在下面的截图中可以看到 保存 撤消 重做 如果窗口 后面 我的申请表是黑的。

    alt text

    现在,像Word这样的微软应用程序可以通过文本后面的模糊来解决这个问题,如您在下一个屏幕截图中看到的:

    alt text

    我听说有一种Win32 API调用可以让它工作。然而,这只是传闻在我这一点上,我没有事实来支持。


    我已经尝试了几种不同的WPF特定的事物来近似什么词:

    • 文本的透明图像,其中包含一个模糊(而不是 TextBlock )

    , )?

    3 回复  |  直到 14 年前
        1
  •  8
  •   themechanix1    14 年前

    我能够在没有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索引的角度看。对我来说很有魅力。

    有一点需要注意:
    如果文本颜色为白色,而模糊颜色为黑色,这似乎最有效。从另一个角度看不太好。好消息是不管你的空气玻璃窗后面是什么,它看起来都很好。

        2
  •  3
  •   Community Egal    7 年前

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

        3
  •  3
  •   Robert Baker    13 年前

    如果有人想再找一个例子,试试这个,它包括对非玻璃的向后支持:

    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>