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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top