2015-06-10 10 views
5

Sto lavorando a un'applicazione WPF in cui ho un evento di doppio clic a livello di finestra che massimizza la finestra dell'app quando un utente raddoppia clicca ovunque all'interno della finestra. Tuttavia, ho anche un controllo personalizzato all'interno della finestra dell'app e un evento doppio clic separato all'interno del controllo personalizzato. Quando un utente fa doppio clic nel controllo personalizzato, solo l'evento del doppio clic del controllo deve essere attivato e la finestra non deve ridimensionare. Il mio codice simile a questa:L'evento doppio fa scattare a livello di finestra e livello di controllo, anche quando viene gestito all'interno del controllo

public class Window 
{ 
    private void window_DoubleClick(object sender, EventArgs e) 
    { 
     /// Maximize/minimize window 
    } 

    private void myCustomControl_DoubleClick(object sender, EventArgs e) 
    { 
     /// Do other things, but PLEASE don't resize! 
     e.Handled = true; 
    } 
} 

E il mio XAML simile a questa:

<Window x:class="MyProject.MyWindow" 
    MouseDoubleClick="window_DoubleClick"> 
    <Grid Grid.Row="0" Margin="0"> 
     <local:myCustomControl 
      MouseDoubleClick="myCustomControl_DoubleClick"/> 
    </Grid> 
</Window> 

Purtroppo, con questo codice a posto, quando l'utente fa doppio clic nel controllo, l'evento di controllo spara, ma si attiva anche l'evento Finestra. Ho provato a impostare e.Handled = true nell'evento di controllo, ma l'evento Window si attiva comunque. L'unica cosa che si è fermato il livello della finestra fare doppio clic su evento da sparo sta gestendo anteprima del controllo personalizzato fare doppio clic su evento di utilizzare questo:

private void myCustomControl_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    e.Handled = true; 
} 

Anche se l'evento di anteprima ferma la finestra fare doppio clic prima di poter sparare, Non posso usarlo senza dover refactoring un bel po 'di codice. Il mio controllo personalizzato ha alcuni controlli figlio che gestiscono anche il suo evento doppio clic. Se l'evento di anteprima viene richiamato al livello di controllo padre, l'evento di doppio clic non esegue mai il tunnel verso il basso attraverso i controlli figlio e, quindi, facendo doppio clic non si esegue ciò che voglio che faccia. Se possibile, vorrei evitare di dover refactoring qualsiasi codice nei controlli figlio. Detto questo, la mia domanda è questa: c'è un modo per fermare l'evento a doppio clic a livello di finestra dal licenziamento una volta che l'evento di doppio clic del controllo è stato gestito? Mi sono fatto impazzire cercando di capirlo ... ogni aiuto è apprezzato!

+1

Si prega di vedere ["Le domande dovrebbero includere" tag "nei loro titoli?"] (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), dove il consenso è "no, non dovrebbero"! –

risposta

2

Il problema è che MouseDoubleClick sembra solo bolla, ma in realtà non lo fa. Da MSDN:

Anche se questo evento indirizzato sembra seguire un percorso spumeggiante attraverso un albero di elemento, in realtà è un evento indirizzato diretta che viene generato lungo l'albero elemento da ciascun UIElement. Se si imposta la proprietà Handled su true in un gestore di eventi MouseDoubleClick, gli eventi successivi MouseDoubleClick lungo il percorso si verificheranno con Handled impostato su false.

Invece è possibile utilizzare l'evento MouseLeftButtonDown e controllare il clickCount:

private void myCustomControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    if (e.ClickCount == 2) 
    { 
     //do something 
     e.Handled = true; 
    } 
} 

Nota: Questo non funziona su MouseLeftButtonUp per qualche motivo.

+0

Grazie per il tuo aiuto! Poiché tutti i figli del mio controllo personalizzato avevano eventi legati al doppio clic, ho deciso di modificare il gestore di eventi a livello di finestra su MouseLeftButtonDown. Funziona magnificamente ora! Grazie ancora! – chelsea

+0

@chelsea Prego! L'evento di doppio clic può essere un problema da usare, quindi cerco regolarmente di evitarlo completamente. –

+0

Per curiosità, c'è qualche documentazione che indica perché questo evento non bolle come il resto? L'articolo MSDN in realtà non fornisce una spiegazione del motivo per cui è fatto in questo modo. – chelsea

0

Vorrei provare ad aggiungere un controllo per il controllo personalizzato nell'evento a livello di finestra. Effettua un controllo di tipo sul mittente se corrisponde al tuo controllo personalizzato, appena ritorna da esso.

+0

In realtà l'ho provato solo per vedere cosa sarebbe successo. Sfortunatamente, il tipo sembra sempre essere la finestra dell'applicazione, indipendentemente dal fatto che il doppio clic si sia verificato nel controllo. – chelsea

Problemi correlati