Come posso applicare un effetto a un bordo ma non al suo contenuto in WPF?
Domanda
Ho un'applicazione WPF che ha una griglia di dati di terze parti con un bordo attorno. Ho usato DropShadowEffect
per mettere un'ombra dietro il bordo, ma questo sembra influire in qualche modo sulle prestazioni (non quasi quanto un BitmapEffect
, ma ancora evidente) e rende il carattere reso fuzzy. C'è un modo per applicare in qualche modo l'effetto al confine, ma non il suo contenuto?
Ho provato a impostare l'effetto sui contenuti su {x: Null}
, ma questo non ha aiutato.
Ecco un'app di esempio che mi è venuta in mente. Mette un'ombra dietro il bordo, ma mette anche un'ombra dietro ogni riga di testo. Voglio l'ombra dietro il bordo, ma non il testo.
<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>
Soluzione
Il link di gcores ha avuto la risposta, che è quello di mettere insieme il bordo e il suo contenuto nella stessa griglia in modo che il contenuto si sovrapponga al bordo.
<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>
Altri suggerimenti
Una soluzione semplice (hack?) è fare
<StackPanel Background="White">
Questo dovrebbe risolvere il testo con il problema dell'ombra esterna (non sono sicuro del problema delle prestazioni). Il problema è che WPF applica effetti all'elemento set e a tutti i suoi figli nella struttura ad albero visivo. Questo link lo spiega meglio: DropShadowEffect performance issue
Prova il seguente blocco (o simile) per tutti i TextBlock:
<TextBlock>
<TextBlock.Effect>
<DropShadowEffect BlurRadius="30" ShadowDepth="5" Color="White"/>
</TextBlock.Effect>
</TextBlock>