2011-02-06 78 views
6

System.Drawing.Graphics类具有一个属性CompositionMode,它具有两个选项:SourceOver(它基于alpha组件,将任何已绘制的背景与已存在的背景混合)或SourceCopy,它只是用正在绘制的任何东西覆盖背景。更改WPF中的Alpha混合模式?

在WPF中有类似的东西吗?

在WPF中,当我在另一个顶部绘制PolyLine时,新的PolyLine总是与背景混合在一起。我认为这与使用的容器无关。我正在使用Canvas,但无法在任何地方找到混合模式属性。我想要做的是上面提到的SourceCopy组合模式。即新的PolyLine应该简单地覆盖Canvas上已有的内容。

有没有一种简单的方法来做到这一点,短的使用像素着色器(据我所知 - 无论如何不会工作,因为我没有访问画布backbuffer)。

我没有被Canvas卡住,很乐意使用任何支持覆盖模式的容器。

我目前有一个基于WriteableBitmap的解决方案,获取System.Drawing.Graphics上下文,然后操作CompositionMode。它的工作原理,但由于我的窗口是全屏,解决方案有严重的性能影响。

说明和示例: WPF窗口完全透明,画布(背景颜色(0,0,0,0))也是完全透明的。现在我用Color.FromArgb(128,128,0,0)绘制PolyLine。我现在有一个半透明的红色折线。接下来,我使用Color.FromArgb(0,0,0,0)绘制相同的PolyLine。由于alpha混合发生,结果与之前一样。然而,我想要的是红色多段线被第二条多段线删除(这正是图形类中SourceCopy模式的作用。)

回答

0

我认为你所需要做的就是确保刷子用于填充/描边PolyLine具有完全不透明的alpha值(即255)。然后背景不应混合到它。

+1

是的,但我需要用任何alpha值覆盖背景,甚至0。请参阅澄清和我刚刚添加到我的问题的例子。 – Harald 2011-02-06 06:00:26

0

您可以应用剪贴蒙版,这样您可以提供剪辑元素的路径低于它,但它可能很难维持很多元素需要修剪后...

+0

在我使用WritableBitmap的当前解决方案中,我应用剪裁矩形(通过AddDirtyRect)。 – Harald 2011-02-06 13:07:47