2010-11-06 4 views
10

J'ai une application WPF qui dessine du texte sur un fond de verre Aero. Le problème est que basé sur ce qui est affiché derrière mon application, le texte dessiné sur le fond de verre peut devenir difficile à lire à carrément-impossible à lire.Comment rendre le texte WPF sur fond de verre Aero lisible?

Comme vous pouvez le voir dans la capture d'écran ci-dessous, la Enregistrer, Annuler et Redo blocs de texte deviennent difficiles à lire si la fenêtre derrière mon application est sombre.

alt text

Maintenant, les applications Microsoft, telles que Word, résoudre cela avec une sorte de flou derrière le texte, comme vous pouvez le voir dans la capture d'écran suivante:

alt text

J'ai entendu Il y a une sorte d'appel d'API Win32 que je peux faire pour que cela fonctionne. Cependant, ce n'est qu'une preuve par ouï-dire à ce moment-ci, je n'ai aucun fait à l'appui.


J'ai essayé quelques choses différentes spécifiques WPF pour rapprocher ce mot fait:

  • ombres portées sur le texte
  • images transparentes de texte avec un flou cuit au (au lieu d'un TextBlock)

Aucun de ceux-ci ne me donne des résultats utilisables, ils ont tous l'air assez minable. Est-ce que quelqu'un sait d'une méthode, WPF ou Win32, que je pourrais utiliser pour dessiner du texte comme le fait Microsoft sur le verre (, c'est-à-dire, lisible)?

Répondre

8

J'ai été capable de résoudre ceci sans Win32 (nécessite .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> 

Ce code a pour effet de doubler le texte et le flou de la version du texte qui est plus derrière, Z-index sage. Fonctionne comme un charme pour moi.

Une chose à noter:
Cela semble fonctionner mieux si la couleur du texte est blanc et la couleur de flou est noir. Cela n'a pas l'air si bon dans l'autre sens. Les bonnes nouvelles sont que cela semble bon indépendamment de ce qui se cache derrière votre fenêtre Aero Glass.

3

La fonction Win32 que vous recherchez est DrawThemeTextEx. Il a un drapeau qui vous permet de dessiner du texte avec une lueur/flou blanc en arrière-plan. Vous pouvez trouver un exemple ici: C# Transparent GUI

+0

Le problème que je voir avec cette méthode est qu'il ne peut pas facilement être appliqué à un contrôle Label ou TextBlock existant, sans recourir à dessiner manuellement le texte avec DrawThemeTextEx. – Triynko

3

Dans le cas où tous ceux qui cherchent un autre exemple, essayez cela, il inclut le support vers l'arrière pour non verre:

Utilisation:

Style="{StaticResource glassText}" 

va dans un dictionnaire de ressources:

<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> 
+0

Ceci est une solution plus propre. Vous pouvez également ajouter '' au déclencheur 'IsMouseOver' obtenir un curseur de main pour' glassLink'. –

Questions connexes