2009-04-30 10 views
9

J'ai une application WPF qui a une grille de données tierce avec une bordure autour. J'ai utilisé le DropShadowEffect pour mettre une ombre derrière la bordure, mais cela semble affecter légèrement les performances (pas autant qu'un BitmapEffect, mais tout de même perceptible) et rend le rendu de police flou. Y at-il un moyen d'appliquer l'effet à la frontière, mais pas son contenu?Comment appliquer un effet à une bordure mais pas à son contenu dans WPF?

J'ai essayé de régler l'effet sur le contenu à {x:Null}, mais cela n'a pas aidé.

Voici un exemple d'application que j'ai trouvé. Il place une ombre derrière la bordure, mais il place également une ombre derrière chaque ligne de texte. Je veux l'ombre derrière la frontière, mais pas le texte.

<Window x:Class="WpfEffectTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <Border BorderBrush="Black" BorderThickness="10" CornerRadius="5" Margin="25"> 
      <Border.Effect> 
       <DropShadowEffect BlurRadius="10" ShadowDepth="5" /> 
      </Border.Effect> 
      <StackPanel> 
       <TextBlock>This is some text</TextBlock> 
       <TextBlock>This is some text</TextBlock> 
       <TextBlock>This is some text</TextBlock> 
       <TextBlock>This is some text</TextBlock> 
       <TextBlock>This is some text</TextBlock> 
       <TextBlock>This is some text</TextBlock> 
      </StackPanel> 
     </Border> 

    </Grid> 
</Window> 

Répondre

12

Le lien de gcores avait la réponse, ce qui est de mettre la frontière et son contenu dans la même grille de sorte que le contenu recouvre la frontière.

<Window x:Class="WpfEffectTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <Border BorderBrush="Black" BorderThickness="10" CornerRadius="5" Margin="25"> 
      <Border.Effect> 
       <DropShadowEffect BlurRadius="10" ShadowDepth="5" /> 
      </Border.Effect> 
     </Border> 
     <StackPanel Margin="35"> 
      <TextBlock>This is some text</TextBlock> 
      <TextBlock>This is some text</TextBlock> 
      <TextBlock>This is some text</TextBlock> 
      <TextBlock>This is some text</TextBlock> 
      <TextBlock>This is some text</TextBlock> 
      <TextBlock>This is some text</TextBlock> 
     </StackPanel> 
    </Grid> 
</Window> 
4

Un simple (pirater?) Solution est de faire

<StackPanel Background="White"> 

Cela devrait résoudre le problème du texte avec ombre portée (Je ne sais pas sur le problème de performance bien). Le problème est que WPF applique des effets à l'élément set et à tous ses enfants dans l'arborescence visuelle. Ce lien explique mieux: DropShadowEffect performance issue

-1

Essayez le bloc suivant (ou similaire) pour tous TextBlocks:

<TextBlock> 
    <TextBlock.Effect> 
     <DropShadowEffect BlurRadius="30" ShadowDepth="5" Color="White"/> 
    </TextBlock.Effect> 
</TextBlock> 
Questions connexes