Sto disegnando in un DrawingContext
e mi piacerebbe applicare un effetto ombra esterna a una parte del disegno. Al momento di creare le parti rilevanti in un DrawingGroup
e applicare una BitmapEffect
, ma questo non ha alcun effetto:Come applicare un effetto ombra discendente durante il disegno su un DrawingContext in WPF?
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);
Questo disegna tutto all'interno della layer
correttamente, ma senza l'effetto ombra.
Cosa sto facendo male/in quale altro modo potrei applicare un'ombra esterna a un gruppo di primitive in un DrawingContext?
Hmm ... Non ho un elemento dell'interfaccia utente padre; questo 'DrawingGroup' è reso direttamente in un' RenderTargetBitmap'. Strano come devo usare gli elementi dell'interfaccia utente per il rendering puro, eh? ... –
Non penso che sia strano - quando si crea una bitmap in memoria, non è stata inviata alla GPU, e quindi la GPU non lo fa arrivare a eseguire i pixel shader. Il vecchio 'BitmapEffects' non usava pixel shader, essi giravano sulla CPU, ed è per questo che hanno lavorato in questo caso. BitmapEffects era però troppo lento la maggior parte del tempo, ed è per questo che sono obsoleti. –
In questa situazione puoi probabilmente usare il gruppo di disegno per riempire un rettangolo e rendere il rettangolo a RenderTargetBitmap (non dimenticare di ridimensionare prima l'elemento) - che dovrebbe (penso) invocare la GPU per chiamare lo shader. –