Como faço para aplicar um efeito a uma fronteira, mas não ao seu conteúdo em WPF?

StackOverflow https://stackoverflow.com/questions/807420

  •  03-07-2019
  •  | 
  •  

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>
Foi útil?

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top