Использовать другое управление в качестве маски непрозрачности в WPF?

C-a C-k C-k C-y C-y
7
задан nsantorello 11 August 2009 в 13:51
поделиться

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 )

2
ответ дан 7 December 2019 в 16:44
поделиться
  • Нет масок
  • Определить визуальную кисть для элемента управления
  • Нарисуйте фигуру прямо поверх элемента управления с помощью этой кисти
  • Перетащите изображение между фигурой и элемент управления
  • Установите непрозрачность кисти для достижения желаемого эффекта
1
ответ дан 7 December 2019 в 16:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: