7

OpacityMask プロパティを VisualBrush と組み合わせて使用​​しようとしています。これにより、画像を別のコントロール (別の画像、四角形、またはその他のコントロールなど) の上にドラッグすると、2 番目のコントロール上の画像の部分に不透明度が違います。つまり、画像にはゼロ以外の基本不透明度があり、別のコントロール上にある画像の任意の部分は異なる (ここでもゼロ以外の) 不透明度を持っています。

これは、VisualBrush と OpacityMask を使用するだけで可能ですか? それとも、より複雑なアプローチが必要ですか?

ありがとう!

編集:画像の不透明度を低く(0.5など)し、コントロール上にドラッグされている部分の不透明度を高く(1.0など)しようとしています。私はもともとこの詳細を省いていましたが、これは採用されたアプローチにとって重要です。

4

2 に答える 2

2

imaの答えに加えて、不透明マスクを使用してこれを理解しました。画像の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のアプローチを使用する方が簡単な場合があります。

マスクレスアプローチとは対照的なこのソリューションの利点の1つは、マスキングコントロールが移動したり、サイズを変更したりした場合に、別のコントロールとの同期を維持することなく、変更を自動的に取得することです。

外観は次のとおり です:(出典:yfrog.com

于 2009-08-11T14:23:45.723 に答える
1
  • マスクなし
  • コントロールのビジュアルブラシを定義する
  • そのブラシでコントロールの真上にシェイプをペイントします
  • 図形とコントロールので画像をドラッグします
  • ブラシの不透明度を設定して、目的の効果を実現します
于 2009-08-11T13:01:20.747 に答える