Использовать другой элемент управления в качестве маски непрозрачности в WPF? - PullRequest
7 голосов
/ 05 августа 2009

Я пытаюсь использовать свойство OpacityMask в сочетании с VisualBrush, чтобы при перетаскивании изображения поверх другого элемента управления (например, другого изображения, прямоугольника или любого другого элемента управления) часть изображения находилась над второй контроль имеет другую непрозрачность. То есть изображение имеет некоторую ненулевую базовую непрозрачность, а любая часть изображения, которая находится над другим элементом управления, имеет другую (опять же, ненулевую) непрозрачность.

Возможно ли это просто с помощью VisualBrush и OpacityMask? Или требуется более сложный подход?

Спасибо!

Редактировать: я пытаюсь сделать изображение с более низкой непрозрачностью (например, 0,5), а та часть, которую перетаскивают на элемент управления, имеет более высокую непрозрачность (например, 1,0). Первоначально я пропустил эту деталь, которая важна для принятого подхода.

Ответы [ 2 ]

2 голосов
/ 11 августа 2009

В дополнение к ответу 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 голос
/ 11 августа 2009
  • Без масок
  • Определение визуальной кисти для элемента управления
  • С помощью этой кисти нарисуйте форму прямо поверх элемента управления
  • Перетаскивание изображения между формой и элементом управления
  • Установить непрозрачность кисти для достижения желаемого эффекта
...