Use outro controle como uma máscara de opacidade no WPF?
-
22-07-2019 - |
Pergunta
Eu estou tentando usar a propriedade OpacityMask combinado com um VisualBrush para que quando você arrastar uma imagem sobre outra controle (como uma outra imagem, um retângulo ou qualquer outro controle), a parte da imagem que está sobre o segundo controlo tem uma opacidade diferente. Ou seja, a imagem tem alguma opacidade base não-zero, e qualquer parte da imagem que é em detrimento de outro controle tem uma opacidade diferente (mais uma vez, não-zero).
Isso é possível simplesmente usando VisualBrush e OpacityMask? Ou é uma abordagem mais complexa necessária?
Obrigado!
Edit: Eu estou tentando fazer a imagem ter alguma opacidade menor (como 0,5), eo ser parte arrastado sobre o controle tem uma opacidade mais elevada (como 1,0). Eu originalmente deixado de fora esse detalhe, o que é importante para a abordagem.
Solução
Além de resposta de ima, eu descobri isso usando uma máscara de opacidade. Eu uso o seguinte código viciado em caso LayoutUpdated para a imagem.
// 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;
Se você quer uma opacidade base desejada, use duas imagens; Aquela que está sempre na opacidade base, e outro que usa a máscara de opacidade que fica em cima dele. Se você quiser a opacidade base para ser maior do que a opacidade mascarado, então ele pode ser mais fácil de usar a abordagem de ima.
Uma vantagem desta solução, por oposição à abordagem sem máscara é que, se os movimentos de controlo de mascaramento, muda de tamanho, etc, este irá responder automaticamente à mudança sem ter de manter um outro controlo em sincronia com ela.
Aqui está como ele olha:
(fonte: yfrog.com )
Outras dicas
- Não máscaras
- Definir escova visual para o controle
- Pintura forma correta na parte superior do controle com essa escova
- imagem Arraste entre a forma eo controle
- Definir opacidade do pincel para conseguir o efeito desejado