Domanda

Voglio sovrascrivere OnMouseClick e OnMouseDoubleClick ed eseguire diverse azioni a seconda dello stile di clic utilizzato.

Il problema è che OnMouseClick si verifica sia per clic singoli che doppi e viene chiamato prima di OnMouseDoubleClick.

Sono certo che questo debba essere un requisito comune, quindi credo che mi manchi qualcosa di abbastanza ovvio. Qualcuno può riempirmi?

Modifica per aggiungere: il conteggio MouseEventArgs.Clicks non aiuta. Nel caso di un doppio clic, il primo clic viene gestito come un singolo clic in OnMouseClick con MouseEventArgs.Clicks == 1.

Modifica per aggiungere: gli oggetti sono miniature di immagini. Il singolo clic dovrebbe attivare e disattivare la selezione per l'esportazione. Il doppio clic dovrebbe rendere la miniatura a schermo intero. La selezione e l'attivazione " le azioni sono ortogonali. Ciò può indicare un problema di fondo con le due azioni ...

Saluti, Rob

È stato utile?

Soluzione

Ciò accade in Windows. Non credo che abbiano aggiunto qualcosa di speciale per gestirlo in .Net.

Il normale modo di gestirlo è

  • a) basta fare qualcosa con un solo clic vorresti accadere prima di un doppio fai clic, come seleziona.
  • b) se questa non è un'opzione, quindi nell'evento clic, avvia un timer. Con il segno di spunta del timer, esegui l'azione con un clic. Se si verifica prima l'evento doppio clic, annulla il timer ed esegui l'azione doppio clic.

Il periodo di tempo impostato per il tempo deve essere uguale al tempo di doppio clic del sistema (che l'utente può specificare nel pannello di controllo). È disponibile da System.Windows.Forms.SystemInformation.DoubleClickTime. I dettagli completi sono in MSDN, qui

Altri suggerimenti

Il problema è che la maggior parte degli oggetti non implementa entrambi. I pochi oggetti che possono ragionevolmente avere diverse azioni per clic singolo e doppio sono generalmente OK per eseguire l'azione del clic singolo prima dell'azione del doppio clic (evidenziare quindi aprire una cartella, attivare lo stato attivo su una barra degli indirizzi prima di selezionarla, ecc.) L'unico il modo per determinare sarebbe probabilmente attendere il singolo clic per un certo periodo di tempo e annullare l'azione per il singolo clic se viene rilevato un doppio clic.

Un'altra possibile soluzione è che la funzione OnMouseDoubleClick chiami OnMouseClick. Poiché l'azione in OnMouseClick è un interruttore binario, la sua chiamata due volte lo reimposta sullo stesso stato.

Quindi, quando l'utente fa doppio clic, Windows chiama OnMouseClick, quindi OnMouseDoubleClick. OnMouseDoubleClick chiama OnMouseClick (di nuovo) per ripristinare lo stato, quindi gestisce il doppio clic.

Sembra una soluzione insoddisfacente, ma funziona.

L'uso di un timer (per ingoiare il primo clic del doppio clic) è altrettanto insoddisfacente e ha l'ulteriore complicazione di gestire le preferenze della percentuale di doppio clic dell'utente.

Saluti, Rob

È possibile avviare un timer nel gestore eventi OnMouseClick.

  • Se il timer scade (diciamo 300ms), è previsto un solo clic.

Else

  • Se un altro evento OnMouseClick è stato generato prima del timeout, è possibile esaminare la posizione x & amp; y del clic e se si trova entro un determinato raggio del primo clic, quindi attivare la funzionalità doppio clic.

Altrimenti

  • Gestisci primo clic e reinizializza il timer per il secondo clic

NB: Questa implementazione ha il vantaggio del fatto che sia il timeoput che il raggio del "doppio clic" possono essere configurati indipendentemente dalla configurazione del sistema consentendo l'importazione di s / w su più macchine /

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top