2

我们有一个控件,我们在 OnRender 中进行自己的自定义绘图。但是,如果您愿意,我们希望使用具有透明度的 PNG 作为各种绘图“通道”的模板。

现在我们已经知道我们可以简单地在 ImageBrush 中使用 PNG 并将其设置为控件的 OpacityMask,但我们实际上想要使用几种不同的模板进行多次绘制。如果我们想走 OpacityMask 路线,我们必须创建单独的控件、单独的 ImageMask,然后将它们全部堆叠在一起,这也会使您的视觉树变得混乱。

我们不想那样做。我们希望在单个Control子类的 OnRender 覆盖中完成所有绘图。我们只希望那些绘制调用被图像掩盖。然后我们想一遍又一遍地重复,直到我们的绘图完成。

有什么办法可以做到这一点?

4

1 回答 1

1

哈!找到了!奇怪的是 S/O 社区在这个问题上如此安静,但对于那些正在寻找它的人来说,它被称为DrawingContext.PushOpacityMask(以及相应的“Pop()”)并且完全按照你的想法做......它推动了一个不透明蒙版(通过画笔)到 DC 上,所有后续绘图都与画笔的不透明度值相关。

您也可以将“蒙版”分层以获得一些非常酷的效果。它们是附加的,而不仅仅是最后一组。

我很确定内置的 OpacityMask 只是在 OnRender 调用中与此函数一起使用。这意味着您仍然可以使用 OpacityMask(前提是您先将其推上),然后再使用您自己的蒙版进行自己的绘图调用。很整洁的东西!

希望这可以帮助其他正在寻找这个的人。

于 2011-12-17T04:41:28.610 回答