実験してみた結果、小さいもの(例えばボタンとか)にエフェクトをかけるのはまだ問題ないんですが、
大きなキャンバスやパネル全体にエフェクトをかけるととにかく動作が遅い!
根本的に問題解決される見込みもないようなので、表現を狭めない為に代替の方法を採用しています。
設定方法は簡単。BorderやRectangleをとにかく重ねる。
んで、影の濃い方から順番に不透明度を落としていきます。
すると、何となくシャドウが落ちているように見える、というわけ。
例)
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="TEST XAML"
Width="140"
Height="160"
>
<Grid Width="100" Height="100" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,10,10,10">
<!--シャドウ部分-->
<Grid>
<Border BorderBrush="#FF000000" Opacity="0.6" Margin="0,0,0,-1" BorderThickness="1" CornerRadius="1"/>
<Border BorderBrush="#FF000000" Opacity="0.4" Margin="-1,0,-1,-2" BorderThickness="1" CornerRadius="2"/>
<Border BorderBrush="#FF000000" Opacity="0.2" Margin="-2,-1,-2,-3" BorderThickness="1" CornerRadius="3"/>
<Border BorderBrush="#FF000000" Opacity="0.1" Margin="-3,-2,-3,-4" BorderThickness="1" CornerRadius="4"/>
</Grid>
<Border BorderThickness="1">
<Border.BorderBrush>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#FF4E62B1" Offset="0.0" />
<GradientStop Color="#FF4E62B1" Offset="1.0" />
</LinearGradientBrush>
</Border.BorderBrush>
<Border BorderThickness="1">
<Border.BorderBrush>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#FFEDFDFF" Offset="0.0" />
<GradientStop Color="#FFBAE2FF" Offset="1.0" />
</LinearGradientBrush>
</Border.BorderBrush>
<Border>
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#FFB1E3FA" Offset="0.0" />
<GradientStop Color="#FF006BE5" Offset="0.5" />
<GradientStop Color="#FF0045C5" Offset="0.5" />
<GradientStop Color="#FF19EEFF" Offset="1.0" />
</LinearGradientBrush>
</Border.Background>
</Border>
</Border>
</Border>
</Grid>
</Window>

もちろん、一方方向にだけシャドウを落とす場合には、バックグラウンドをグラデーションにしたBorderやRectangleの不透明度を下げると同じようにシャドウに見えます。
いずれにしろ、プログラマーには嫌がられる方法です。何故ならそれだけでメモリを食うんで。
それでもビットマップエフェクトをかけるよりはまし。
明日はサンプル的なものを作ってみよう!
iPhoneからの投稿