除了 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)