Como faço para aplicar um efeito a uma fronteira, mas não ao seu conteúdo em WPF?
Pergunta
Eu tenho um aplicativo WPF que tem uma grade de dados 3o partido com uma borda em torno dela. Eu usei o DropShadowEffect
para colocar uma sombra atrás da fronteira, mas este parece afetar o desempenho um pouco (não quase tanto quanto um BitmapEffect
, mas ainda perceptível) e faz a fonte tornando difusa. Existe uma maneira de alguma forma aplicar o efeito da fronteira, mas não seu conteúdo?
Eu tentei definindo o efeito sobre o conteúdo para {x:Null}
, mas isso não ajuda.
Aqui é um aplicativo de exemplo que eu vim com. Ela coloca uma sombra atrás da fronteira, mas também coloca uma sombra atrás de cada linha de texto. Eu quero a sombra por trás da fronteira, mas não o texto.
<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>
Solução
O link de gcores tinha a resposta, que é colocar a fronteira e seu conteúdo juntos na mesma grelha de modo que o conteúdo se sobrepõe a fronteira.
<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>
Outras dicas
Uma simples (hack?) Solução é fazer
<StackPanel Background="White">
Isto deve resolver o texto com problema drop-shadow (Não tenho certeza sobre o problema de desempenho embora). O problema é que WPF aplica efeitos ao elemento set e toda a crianças na árvore visual. Este link explica melhor: DropShadowEffect problema de desempenho
Tente o seguinte bloco (ou similar) para todos os TextBlocks:
<TextBlock>
<TextBlock.Effect>
<DropShadowEffect BlurRadius="30" ShadowDepth="5" Color="White"/>
</TextBlock.Effect>
</TextBlock>