2009-08-05 19 views
7

Sto cercando di utilizzare la proprietà OpacityMask combinata con un VisualBrush in modo che quando si trascina un'immagine su un altro controllo (come un'altra immagine, un rettangolo o qualsiasi altro controllo), la parte dell'immagine che si trova oltre il secondo controllo ha una diversa opacità. In altre parole, l'immagine ha un'opacità di base diversa da zero e qualsiasi parte dell'immagine che si trova su un altro controllo ha un'opacità diversa (ancora una volta diversa da zero).Utilizzare un altro controllo come maschera di opacità in WPF?

È possibile utilizzare semplicemente VisualBrush e OpacityMask? O è richiesto un approccio più complesso?

Grazie!

Modifica: Sto cercando di rendere l'immagine con un'opacità inferiore (ad esempio 0,5) e la parte trascinata sul controllo ha una maggiore opacità (ad esempio 1.0). Inizialmente avevo omesso questo dettaglio, che è importante per l'approccio adottato.

+0

ho l'idea di utilizzare un'immagine o la forma che viene plasmato il modo in cui è modellato il controllo e fare in giro con l'offset del OpacityMask quando si sposta l'oggetto, ma che in genere non sarebbe una buona soluzione, specialmente se il controllo che si desidera utilizzare come maschera è dinamico (nel mio caso non lo è). – nsantorello

+0

Ho dimenticato di menzionare la ragione per cui in genere non sarebbe una buona soluzione perché se volessi una sorta di opacità di base sull'immagine (che, faccio), dovresti fare quell'immagine che "falsifica" il controllo molto grande (per adattarsi a grandi offset o grandi immagini mascherabili). – nsantorello

+0

hai appena ottenuto 34 ripetizioni, come hai iniziato a generare 150 abbonamenti? – Sadegh

risposta

2

In aggiunta alla risposta di ima, l'ho capito usando una maschera di opacità. Io uso il seguente codice collegato all'evento LayoutUpdated per l'immagine.

// 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 si desidera un'opacità di base desiderata, utilizzare due immagini; uno che è sempre all'opacità di base, e un altro che usa la maschera di opacità che si trova sopra di essa. Se vuoi che l'opacità di base sia più alta dell'opacità mascherata, allora potrebbe essere più facile usare l'approccio di ima.

Un vantaggio di questa soluzione rispetto all'approccio senza maschera è che se il controllo di mascheramento si sposta, cambia dimensione, ecc., Questo raccoglierà automaticamente la modifica senza dover mantenere un altro controllo sincronizzato con esso.

Ecco come appare: http://img149.yfrog.com/img149/4183/99793865.jpg

+0

Come ho detto, se si desidera l'opacità di base> l'opacità mascherata, non credo che si possa usare questo approccio poiché utilizza due immagini e si può solo aggiungere opacità, non sottrarla. L'approccio che ima suggerisce sarebbe probabilmente il migliore per un'opacità mascherata di opacità di base. Ma credo che la mia soluzione sia un ottimo modo per farlo al contrario. – nsantorello

1
  • Nessun maschere
  • Definisci pennello visiva per il controllo
  • forma della vernice a destra sulla parte superiore del controllo con quello
  • immagine Trascinare tra la forma ed il controllo
  • Set opacità del pennello il pennello per ottenere l'effetto desiderato
+0

Non ho ancora provato questo, ma sembra che sarebbe bello se volessi avere un'opacità più bassa rispetto al controllo. E se volessi una maggiore opacità (cioè l'immagine in Opacity = 0.5 e la parte sul controllo in Opacity = 1.0)? Penserei che questo approccio può solo abbassare l'opacità dell'immagine, non aumentarla. Per favore correggimi se sbaglio. Grazie. :) – nsantorello

+0

Ho notato che inizialmente non avevo specificato questo requisito nella mia domanda. Ho modificato la domanda per includerla. – nsantorello

+0

cancellati aggiornamenti sbrigativi e errati – ima

Problemi correlati