48

Whenever I set the Border.Effect property to a drop shadow effect every control contained within the control has a drop shadow.

Is there a way to set the shadow just to the border and not every control contained in the border?

Here is a short example of my code:

<Grid>
 <Border Margin="68,67,60,67" BorderBrush="Black" BorderThickness="1" CornerRadius="10">
  <Border.Effect>
   <DropShadowEffect/>
  </Border.Effect>
  <Rectangle Fill="White" Stroke="Black" Margin="37,89,118,98" />
 </Border>
</Grid>
ΩmegaMan
  • 29,542
  • 12
  • 100
  • 122
Petezah
  • 1,465
  • 4
  • 26
  • 30

3 Answers3

62

Two choices:

Option 1: Add a border element with the effect on it as a sibling of the border / rectangle element tree you have. Something like this:

<Grid>
    <Border Margin="68,67,60,67"
            BorderBrush="Black"
            BorderThickness="1"
            CornerRadius="10">
        <Border.Effect>
            <DropShadowEffect />
        </Border.Effect>
    </Border>
    <Border Margin="68,67,60,67"
            BorderBrush="Black"
            BorderThickness="1"
            CornerRadius="10">

        <Rectangle Fill="White"
                   Stroke="Black"
                   Margin="37,89,118,98">
        </Rectangle>
    </Border>

</Grid>

Option 2: Put the rectangle as a sibling of the border element like this:

   <Grid>
    <Border Margin="68,67,60,67"
            BorderBrush="Black"
            BorderThickness="1"
            CornerRadius="10">
        <Border.Effect>
            <DropShadowEffect />
        </Border.Effect>
    </Border>
    <Rectangle Fill="White"
               Stroke="Black"
               Margin="37,89,118,98">
    </Rectangle>

</Grid>

NOTE: You will have to tweak the layout on the second solution to make the rectangle line up where you want it

Grant Birchmeier
  • 17,809
  • 11
  • 63
  • 98
Brad Cunningham
  • 6,402
  • 1
  • 32
  • 39
  • 4
    Incase you have added some other contents (instead rectangle) inside the Grid panel, set the Grid panel's Background property to avoid entire contents get drop-shadow. For example, ' ...... .... ' – Suriya Mar 13 '14 at 07:28
3

I realise that your question has an answer, but it doesn't appear to have the simplest answer. The simplest answer to your question is for you to just colour the background of the control that you set the shadow on. Like so:

<Grid>
    <Border Margin="68,67,60,67" Background="White" BorderBrush="Black" 
        BorderThickness="1" CornerRadius="10">
        <Border.Effect>
            <DropShadowEffect/>
        </Border.Effect>
        <Rectangle Fill="White" Stroke="Black" Margin="37,89,118,98" />
    </Border>
</Grid>

And the result:

NoShadowFallThrough

Sheridan
  • 68,826
  • 24
  • 143
  • 183
1

I tried going for a similar design to this toolbar in white:

enter image description here

This is what I used:

<Border CornerRadius="8" Background="White" Grid.Row="1">
    <Border.Effect>
        <DropShadowEffect ShadowDepth="3" Opacity="0.2"/>
    </Border.Effect>
</Border>
Eduards
  • 1,734
  • 2
  • 12
  • 37