2011-12-17 20 views
2

私たちはOnRenderで独自のカスタム図面を作成するコントロールを持っています。しかし、私たちはあなたが望むなら、様々な図面のパスのためのステンシルの一種として透明性を持つPNGを使いたいと思っています。カスタムドローイングはどうやってマスクを使って行うことができますか?

ImageBrushで単純にPNGを使用し、コントロールのOpacityMaskとして設定できることは既にわかっていますが、いくつかの異なるステンシルを使用していくつかの描画パスを実際に実行したいと考えています。 OpacityMaskのルートに行きたい場合は、別々のコントロールを作成し、ImageMaskを分離し、それらをすべて重ねてスタックすることで、ビジュアルツリーが乱雑になります。

私たちはそれをしたくありません。単一のControlサブクラスのOnRenderオーバーライドですべての描画を行いたいと考えています。これらの描画呼び出しをイメージで隠すだけでいいです。私たちはそれが終わるまで何度も何度も繰り返したいと思っています。

これはどのようにして行うことができますか?

答えて

1

HA!それを見つけた! S/Oコミュニティーはこれほど静かですが、探している人にとってはDrawingContext.PushOpacityMask(およびそれに対応する 'Pop()')と呼ばれ、まさにあなたがそう思っていることをします...それは不透明を押しますDC上に(ブラシを介して)マスクされ、その後のすべての描画は、ブラシの不透明度値に相対的です。

また、かなりクールな効果のために「マスク」をレイヤーすることもできます。これらは最後のセットだけでなく、追加的なものです。

組み込みのOpacityMaskは、OnRender呼び出しでこの関数とともに使用されていることは間違いありません。つまり、OpacityMask(最初にプッシュした場合)を使用してから、独自の描画呼び出し用に独自のマスクを使用することができます。かなり素敵なもの!

これは、これをお探しの他の人に役立つと思います。

+0

あなたは自分の質問でイメージでマスクしたいと言った。私はイメージがブラシオブジェクトに埋め込まれると仮定しますか? –

+0

これを行うには 'ImageBrush'を使わなければなりません。描画エリアとイメージが1対1の比率でない場合は、ブラシのプロパティを使用してトリッキーを行う必要があります。どちらか、またはあなたのイメージソースにその寸法を問い合わせて、あなたのコントロールがそれらに従うようにする必要があります。いずれにせよ、それはこれの範囲外です。ただし、Push文は累積的です。たとえば、最初にOpacityMaskをプッシュしてデフォルトの動作をさせた後、独自のマスクを押してから描画します。よく働く! – MarqueIV

+0

それから。ニースのヒント:) –

関連する問題