В дополнение к ответу 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 )