2009-08-05 15 views
7

私はたVisualBrushと組み合わさOpacityMaskプロパティを使用しようとしているので、あなたは、第二コントロール上にある画像の一部(例えば、別の画像、矩形、または他の任意の対照として)別のコントロールの上に画像をドラッグすると異なる不透明度を有する。つまり、イメージには非ゼロの基本不透明度があり、別のコントロールの上にあるイメージの任意の部分は、異なる(再びゼロ以外の)不透明度を持ちます。WPFで不透明マスクとして別のコントロールを使用しますか?

は単純たVisualBrushとOpacityMaskを使用して可能このですか?または、より複雑なアプローチが必要ですか?

ありがとうございます!

編集:私は、画像をいくつか下の不透明度(例えば0.5)を持たせるためにしようとしている、と一部がコントロール上にドラッグされているが(例えば1.0など)は、より高い不透明度を持っています。もともと私は、このアプローチの重要な部分を除外しました。

+0

私はコントロールが形作られている方法で成形し、された画像や図形を使用するためにアイデアを持っているあなたがオブジェクトを移動するときOpacityMaskのオフセットが、それをいじり通常、マスクとして使用したいコントロールが動的である場合(私の場合はそうではありません)、良い解決策にはなりません。 – nsantorello

+0

画像に基本的な不透明度が必要な場合(これは私が行う)、コントロールを非常に「偽」する必要があるため、一般的には良い解決策ではない理由を忘れています。大きい(大きなオフセットや大きなマスク可能な画像に対応するため)。 – nsantorello

+0

あなたは34人の担当者を得ています。 – Sadegh

答えて

2

イマの答えに加えて、私はこれを理解した不透明マスクを使用します。イメージのLayoutUpdatedイベントにフックされた次のコードを使用します。

// Make a visual brush out of the masking control. 
VisualBrush brush = new VisualBrush(maskingControl); 
// Set desired opacity. 
brush.Opacity = 1.0; 
// Get the offset between the two controls. 
Point offset = controlBeingMasked.TranslatePoint(new Point(0, 0), maskingControl); 
// Determine the difference in scaling. 
Point scale = new Point(maskingControl.ActualWidth/controlBeingMasked.ActualWidth, 
    maskingControl.ActualHeight/controlBeingMasked.ActualHeight); 
TransformGroup group = new TransformGroup(); 
// Set the scale of the mask. 
group.Children.Add(new ScaleTransform(scale.X, scale.Y, 0, 0)); 
// Translate the mask so that it always stays in place. 
group.Children.Add(new TranslateTransform(-offset.X, -offset.Y)); 
// Rotate it by the reverse of the control, to keep it oriented correctly. 
// (I am using a ScatterViewItem, which exposes an ActualOrientation property) 
group.Children.Add(new RotateTransform(-controlBeingMasked.ActualOrientation, 0, 0)); 
brush.Transform = group; 
controlBeingMasked.OpacityMask = brush; 

希望するベースの不透明度が必要な場合は、2つの画像を使用します。 1つは常に基底の不透明度にあり、もう1つはその上にある不透明マスクを使用します。ベースの不透明度をマスクされた不透明度よりも高くするには、imaのアプローチを使用する方が簡単かもしれません。マスクレスアプローチとは対照的に、この溶液の

一つの利点は、マスキング制御移動は、サイズなどを変更した場合、これは自動的に同期して他のコントロールを維持することなく、変更をピックアップすることです。ここで

は、それがどのように見えるかです: http://img149.yfrog.com/img149/4183/99793865.jpg

+0

基本的な不透明度>マスクされた不透明度が必要な場合は、2つの画像を使用しているため、このアプローチを使用できないと思います。このアプローチは、おそらくベースの不透明度>マスクされた不透明度に最適だろうと示唆しています。しかし私は、私のソリューションは逆にそれを行うための素晴らしい方法だと信じています。 – nsantorello

1
  • なしマスク
  • オレンジ色画像間の形状の制御
  • セット不透明そのブラシと右コントロールの上に制御
  • ペイント形状のための視覚ブラシを定義所望の効果を達成するためのブラシ
+0

私はまだこれを試していませんが、コントロールよりも不透明度を低くしたい場合、これが素晴らしいと思われます。不透明度を高くしたい場合(つまり、不透明度= 0.5の画像と不透明度= 1.0のときのコントロール上の画像)私は、この方法では画像の不透明度を下げることができますが、それを上げることはできないと考えています。私が間違っているなら、私を修正してください。ありがとう。 :) – nsantorello

+0

私はもともと私の質問でこの要件を指定していないことがわかりました。私はこれを含めるために質問を編集しました。 – nsantorello

+0

急いで間違った更新を削除しました – ima

関連する問題