在WPF中使用另一个控件作为不透明蒙板?

时间:2009-08-05 15:08:08

标签: wpf controls transparency opacity mask

我正在尝试将OpacityMask属性与VisualBrush结合使用,这样当您将图像拖到另一个控件(例如另一个图像,矩形或任何其他控件)上时,图像的一部分超过了第二个控件具有不同的不透明度。也就是说,图像具有一些非零基础不透明度,并且图像中任何位于另一个控件上的部分具有不同的(再次,非零)不透明度。

这可以简单地使用VisualBrush和OpacityMask吗?或者需要更复杂的方法?

谢谢!

编辑:我正在尝试使图像具有较低的不透明度(例如0.5),并且在控件上拖动的部分具有较高的不透明度(例如1.0)。我最初忽略了这个细节,这对采取的方法很重要。

2 个答案:

答案 0 :(得分: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;

如果您想要所需的基本不透明度,请使用两个图像;一个始终处于基本不透明度的一个,另一个使用位于其顶部的不透明蒙板。如果您希望基本不透明度高于蒙版不透明度,那么使用ima的方法可能更容易。

与无掩模方法相比,此解决方案的一个优点是,如果屏蔽控制移动,更改大小等,这将自动获取更改,而无需保持另一个控件与其同步。

以下是它的外观:
(来源:yfrog.com

答案 1 :(得分:1)

  • 没有面具
  • 为控件定义可视画笔
  • 使用该画笔在控件顶部绘制形状
  • 在形状和控件之间拖动图像
  • 设置画笔的不透明度以达到预期效果