我们有一个控件,我们在OnRender中自己定制绘图。但是,我们希望使用具有透明度的PNG作为各种绘图和通道的模板。如果你愿意的话。
现在我们已经知道我们可以在ImageBrush中简单地使用PNG并将其设置为控件的OpacityMask,但我们实际上想要使用几个不同的模板进行多次绘图。如果我们想要使用OpacityMask路径,我们必须创建单独的控件,单独的ImageMasks,然后将它们全部堆叠在一起,这也会使您的可视树混乱。
我们不想这样做。我们想要在OnRender覆盖单个Control
子类中完成所有绘制。我们只是希望这些绘制调用被图像掩盖。然后我们想一遍又一遍地重复这一点,直到我们的绘图完成。
任何方式都可以做到这一点?
答案 0 :(得分:1)
HA!找到了!奇怪的是S / O社区在这个问题上一直很安静,但是对于那些寻找它的人来说,它被称为DrawingContext.PushOpacityMask
(以及相应的'Pop()')并完全按照你的想法行事......它将不透明蒙板(通过画笔)推到DC上,所有后续绘图都相对于画笔的不透明度值。
你也可以为一些非常酷的效果分层'掩码'。它们是附加的,而不仅仅是最后一组。
我很确定内置的OpacityMask只是在OnRender调用中与此函数一起使用。这意味着你仍然可以使用OpacityMask(如果你先推动它),然后使用你自己的面具进行自己的绘图调用。非常整洁的东西!
希望这有助于其他正在寻找此事的人。