2011-02-06 12 views
6

La classe System.Drawing.Graphics ha un CompositionMode immobile con due opzioni: SourceOver (che, sulla base della componente alfa, mescola tutto ciò che è disegnato con lo sfondo già esistente) o SourceCopy che sovrascrive semplicemente lo sfondo con tutto ciò che è in corso di elaborazione.Modifica la modalità di fusione alfa in WPF?

Esiste qualcosa di simile in WPF?

In WPF quando ho disegnare una polilinea ad esempio su un altro della nuova polilinea alphablends sempre con lo sfondo. Penso che sia indipendente dal contenitore in uso. Sto usando una tela ma non ho trovato una proprietà della modalità di fusione da nessuna parte. Quello che voglio fare è ciò che fa il metodo di composizione SourceCopy sopra menzionato. Cioè il nuovo PolyLine dovrebbe semplicemente sovrascrivere ciò che è già presente sulla tela.

C'è un modo semplice per farlo, a meno di usare pixel shader (che - per quanto ho capito - non funzionerebbe comunque perché non ho accesso al backbuffer Canvas).

Non sono bloccato con una tela e sarei felice di utilizzare qualsiasi contenitore che supporti la modalità di sovrascrittura.

Attualmente ho una soluzione basata su un WriteableBitmap per il quale ottengo un contesto System.Drawing.Graphics e quindi manipolo il CompositionMode. Funziona ma dal momento che la mia finestra è a schermo intero, questa soluzione ha gravi impatti sulle prestazioni.

Chiarificazione ed esempio: La finestra WPF è completamente trasparente e quindi è la tela (back colore terra (0,0,0,0)). Ora disegno un PolyLine con Color.FromArgb (128,128,0,0). Ora ho una polilinea rossa semitrasparente. Successivamente disegno la stessa polilinea con Color.FromArgb (0,0,0,0). Il risultato è lo stesso di prima a causa della fusione alfa in atto. Quello che voglio, tuttavia, è che la polilinea rossa venga cancellata con la seconda polilinea (che è esattamente ciò che fa la modalità SourceCopy nella classe Graphics.

risposta

0

Penso che tutto ciò che devi fare è assicurarti che i pennelli usati riempimento/corsa del PolyLine hanno valori alfa completamente opaco (cioè 255). Poi il fondo non deve essere miscelato in esso.

+1

Sì, ma ho bisogno di sovrascrivere lo sfondo con qualsiasi valore alpha, anche 0. Vedere il chiarimento ed esempio ho appena aggiunto alla mia domanda. – Harald

0

si potrebbe applicare una maschera di ritaglio, in questo modo è possibile fornire il percorso di clip sugli elementi che sono al di sotto di esso, ma potrebbe essere difficile da mantenere, dopo un sacco di elementi sono necessari per essere fermato ...

+0

Nella mia attuale soluzione che utilizza WritableBitmap, applico un clipping rect (tramite AddDirtyRect). – Harald

Problemi correlati