2009-10-29 11 views
11

Sto provando a intercettare gli eventi del mouse in WPF utilizzando una finestra non modale più in alto e trasparente. Sto scoprendo che questo funziona bene se l'opacità della finestra è 0,01 o superiore e ha un colore di sfondo, ma quando l'opacità è impostata su 0 non riceve più i messaggi del mouse. C'è un modo per rendere questa finestra completamente trasparente e ottenere comunque l'input del mouse?Creare una finestra WPF completamente trasparente per acquisire gli eventi del mouse

+0

finestre trasparenti possono causare problemi in generale, sono un po 'curioso perché sei andato con questo approccio. Capisco che il 3.5 SP1 abbia risolto alcuni dei principali problemi, ma è comunque un modo abbastanza pesante per intercettare l'input del mouse. Posso già prendere in consegna lo schermo, forse sarebbe meglio farlo all'interno della finestra dell'applicazione stessa? – Egor

risposta

28

Per quanto ne so, no.

Quando uno Control o Window è completamente trasparente, può essere fatto clic su. Questo è il caso se imposti il ​​tuo Window.Background="Transparent" o Opacity="0". Per quanto ne so, questo è di progettazione in WPF.

Quando si utilizza un'opacità del 0,01, si dovrebbe a malapena a vedere la finestra, se non del tutto. Questa è probabilmente la soluzione migliore per ottenere la funzionalità.

Modifica: Un'altra soluzione, che ho provato e funziona, è impostare il colore di sfondo su un colore quasi trasparente. Ho usato Background="#01000000", dando così un valore alfa di 1. Ciò rende la finestra sullo sfondo trasparente, ma consente di posizionare i controlli su di essa con la finestra in piena opacità.

+0

Sì, non sono riuscito a trovare una soluzione alternativa. Ha senso. –

+0

Vedere la mia modifica per una soluzione diversa. Puoi cambiare lo sfondo in un colore quasi trasparente e mantenere la finestra in piena opacità nel caso in cui desideri sovrapporre alcuni controlli sullo schermo. –

+0

La seconda soluzione funziona ma sembra uguale a quella di Opacity a 0,01. –

3

Basta impostare Sfondo = Brushes.Transparent invece di Sfondo = null.

Non è necessario utilizzare l'opacità a tutti (es. Solo lasciarlo al 100% di opacità).

+4

Ho provato questo, pensando la stessa possibilità, ma non funziona. Quando lo sfondo è trasparente, i clic non vengono acquisiti dal programma, invece di afferrare qualsiasi programma si trovi al di sotto. –

+0

Puoi mostrare un esempio? Io uso questo approccio (in genere # 00000000 perché è così facile da scrivere) e sembra funzionare bene per me. – Egor

0

Impostare l'opacità al 100% (o qualsiasi valore diverso da zero), e lo sfondo su trasparente (anziché null) dovrebbe rendere maggior parte dei controlli hittable.

Assicurarsi di impostare IsHitTestVisible su true. Non tutti i controlli possono essere colpiti, anche se l'opacità è al 100% e lo sfondo è trasparente.

+0

Forse sto facendo qualcosa di sbagliato, ma quando faccio un Show su una finestra con queste impostazioni non viene visualizzato affatto (cioè la finestra non è presente quando si alt + tab). –

12

In Visual Studio 2010: Selezionare la finestra nella vostra vista di disegno.

Impostare le proprietà della finestra a:

  • AllowsTransparency: controllare
  • Background: trasparente
  • WindowStyle: Nessuno
+2

Non sono sicuro del motivo per cui questo non ha ricevuto alcun +1, funziona perfettamente! – JMK

+1

@ JMK Perché questo fa passare i clic attraverso la finestra, a meno che non si prenda un controllo effettivo all'interno della finestra. – prettyvoid

+0

La chiave per me era "AllowsTransparency" – ariel

1

Per esempio penso che il tuo nome di controllo è MyGrid e vuoi che sia Transparent e ottieni sempre MouseOverEvent .....

Se (finestra AllowsTransparency è Truee la finestra Background è Transparent) Poi

uso un colore come #01777777 per MyGridBackgroundO0.01 per MyGridOpacity.

Else

uso qualcosa come #00777777 per MyGridBackgroundO0.00 per MyGridOpacity.

0

Si potrebbe trovare più semplice da usare Mouse.Capture.

https://msdn.microsoft.com/en-us/library/ms771301.aspx

Quando un oggetto cattura il mouse, tutti gli eventi relativi del mouse sono trattati come se l'oggetto con il mouse cattura eseguire l'evento, anche se il puntatore del mouse si trova sopra un altro oggetto.