Come posso applicare un effetto a un bordo ma non al suo contenuto in WPF?

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

  •  03-07-2019
  •  | 
  •  

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>
È stato utile?

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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top