2011-12-28 54 views
8

我正在繪製一個DrawingContext,我想將陰影效果應用於部分繪圖。目前,我創建一個DrawingGroup相關部分和應用BitmapEffect,但這並沒有影響:如何在繪製到WPF中的DrawingContext時應用陰影效果?

var layer = new DrawingGroup(); 
using (var lcontext = layer.Open()) 
{ 
    // draw stuff in lcontext 
} 
layer.BitmapEffect = new DropShadowBitmapEffect { Color = Colors.Black, ShadowDepth = 3, Opacity = 0.5 }; 
context.DrawDrawing(layer); 

這正確繪製layer裏面的一切,但沒有陰影效果。

我在做什麼錯誤/我怎麼可以將一個陰影應用到DrawingContext中的一組基元?

回答

2

BitmapEffect是.NET 3.5以前版本的一箇舊屬性(它們使用CPU渲染效果)。財產has no effect在4.0。

在4.0中,您應該使用Effect屬性,該屬性使用像素着色器。

DrawingGroup但是似乎沒有效果屬性 - 聽起來像您可能需要set the effect on the parent UI element instead

+1

嗯......我沒有父UI元素;這個'DrawingGroup'被直接渲染成一個'RenderTargetBitmap'。奇怪的是我如何使用UI元素進行純粹的渲染,呃?... – 2011-12-28 16:25:02

+0

我不認爲這很奇怪 - 在內存中創建位圖時,它沒有被髮送到GPU,所以GPU不會開始運行像素着色器。舊的'BitmapEffects'沒有使用像素着色器,它們運行在CPU上,這就是爲什麼它們在這種情況下工作的原因。儘管BitmapEffects大部分時間太慢,這就是它們被廢棄的原因。 – 2011-12-30 15:07:50

+0

在這種情況下,您可能可以使用繪圖組來填充Rectangle,並將Rectangle渲染爲RenderTargetBitmap(不要忘記先調整元素的大小) - 應該(我認爲)調用GPU來調用着色器。 – 2011-12-30 15:09:05

-3

如果您運行的是.NET Framework 3.5 SP1或更高版本,則應該使用UIElement.EffectVisual.VisualEffect(這是受保護的,因此您需要從中派生),而使用System.Windows.Media.Effects.DropShadowEffect的實例。

+0

'DrawingGroup'既不是'Visual'也不是'UIElement',那麼我在哪裏應用該效果? – 2012-03-07 14:19:57

+0

@romkyns - 是的,因爲DrawingGroup是一個層次/樹的概念,而不是「視覺」的概念。你把什麼放在你的小組?你必須有一些「視覺」的東西來作爲陰影的基礎。 – 2012-03-07 14:28:53

+1

我將圖片和圖元等東西繪製到我的'DrawingGroup'中(使用問題中引用的代碼)。然後我使用'DrawDrawing'渲染它。我想要做同樣的事情,但是'DrawingGroup'中的所有內容都會投下陰影。 – 2012-03-07 14:40:24