在WPF中创建阴影而不使用效果

时间:2013-01-07 10:29:38

标签: c# wpf

问题如下:我们有一个应用程序在名为Display的控件中显示实时图像。在显示控件内的实时图像上可以存在(可能是交互式的)图层(Display控件基本上是底部带有LiveImageLayer的网格)。大多数可用图层由线条图形组成,不会遮挡图像。某些图层由标准WPF控件(如按钮或滑块)组成(具有更改的模板,因此它们使用线条图形进行渲染)。甚至可以使用DrawingContext直接绘制某些图层。

为了提高实时噪声图像之上的图层图形的可见性和可读性,我们尝试为图层分配DropShadow效果。从视觉角度来看,这非常有效。但是,从性能的角度来看,这是非常糟糕的。由于ImageLayer的快速更新(高达60Hz),所有具有图像更新频率的图层都会重新计算DropShadow个效果(即使图层本身不会改变)。

我们可以为每一层手动实现老式阴影(下面用黑色笔刷相同的图形,向右下方移动)。如果没有更好的方法,我们实际上会这样做。

所以,我的问题是:是否有任何自动或半自动方式来实现这样的阴影?我想在实际图层下面创建移位矩形,将画笔设置为实际图层的可视画笔。但是,我发现没有办法(除了效果)将视觉刷重新着色为黑色。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我有一段时间与shodows有类似的性能问题,我最终只是使用Border来制作假阴影,但是在我的Usercontrols中,我使用LinearGradientBrush使阴影更逼真但我记不起画笔设置了,但这就是它产生的效果。

enter image description here

<Grid>
     <Border Margin="57,74,162,114" BorderThickness="2,0,0,2" CornerRadius="5" BorderBrush="#AA000000">
            <Button Content="StackOverflow" />
    </Border>
</Grid>

WPF Effects被渲染为阴影以解决像你描述的问题,这有点令人遗憾。