Pergunta

Eu quero substituir OnMouseClick e OnMouseDoubleClick e executar ações diferentes, dependendo de qual estilo clique foi usado.

O problema é que OnMouseClick está acontecendo tanto para cliques duplos e individuais, e está sendo chamado antes OnMouseDoubleClick.

Estou certo de que este deve ser um requisito comum, então eu acho que estou perdendo algo bastante óbvio. alguém pode me preencher?

Editar para adicionar: a contagem MouseEventArgs.Clicks não ajuda. No caso de um clique duplo, o primeiro clique é tratado como um único clique em OnMouseClick com MouseEventArgs.Clicks == 1.

Editar para acrescentar: os objetos são miniaturas de imagens. Único clique deve mudar a selecção on e off para exportação. Dê um duplo clique deve fazer a tela cheia miniatura. A seleção e ações "ativação" são ortogonais. Isso pode indicar um problema subjacente com a duas ações ...

Cheers, Rob

Foi útil?

Solução

Isso acontece em todo o Windows. Eu não acho que eles adicionaram nada de especial para lidar com isso na Net.

Os meios normais de manusear este é

  • a) apenas fazer algo único clique você gostaria de acontecer antes de um duplo clique, como selecionar.
  • b) se isso não é uma opção, em seguida, no evento de clique, iniciar um temporizador. Na marcação timer, fazer a ação um único clique. Se o evento de clique duplo ocorrer primeiro, matar o timer, e fazer a ação de duplo clique.

A quantidade de tempo que você definir o tempo para deve ser igual ao tempo de clique duplo do sistema (que o usuário pode especificar no painel de controle). Está disponível a partir System.Windows.Forms.SystemInformation.DoubleClickTime. Os detalhes completos estão no MSDN, aqui

Outras dicas

O problema é que a maioria dos objetos não implementar ambos. Os poucos objetos que podem razoavelmente têm ações diferentes para cliques duplos e individuais geralmente são OK para executar a ação de clique único antes da ação de duplo clique (destaque em seguida, abrir uma pasta, digite foco em uma barra de endereços antes de selecioná-lo, etc.) A única maneira de determinar provavelmente seria de esperar no único clique para uma quantidade de tempo e cancelar a ação para o único clique se um duplo clique é detectado.

Outra solução possível é ter a chamada de função OnMouseDoubleClick OnMouseClick. Como a ação em OnMouseClick é uma alternância binária, chamando-o duas vezes redefine para o mesmo estado.

Assim, quando o usuário clica em duplas, as chamadas janelas OnMouseClick, então OnMouseDoubleClick. OnMouseDoubleClick chama OnMouseClick (novamente) para restaurar o estado, em seguida, lida com o duplo clique.

Isto parece insatisfatória como uma solução, mas funciona.

Usando um temporizador (para engolir o primeiro clique do clique duplo) é igualmente insatisfatória, e tem a complicação adicional de lidar com preferências de tarifas Dê um duplo clique do usuário.

Cheers, Rob

Você poderia começar um temporizador dentro do manipulador de eventos OnMouseClick.

  • Se os tempos do temporizador out (300ms Say), em seguida, um único clique se destina.

Else

  • Se um outro evento OnMouseClick foi gerado antes dos tempos de tempo fora, você poderia examinar o x e y posição do clique e se a sua dentro de um raio particular do primeiro clique, em seguida, a ação a funcionalidade de clique duplo.

Caso contrário

  • Handle primeiro clique e temporizador reinicializar para segundo clique

NB: Esta implementação tem a vantagem do facto de tanto o timeoput e o raio 'duplo-clique' pode ser configurado de forma independente da configuração do sistema permitindo que o S / W para ser importados para várias máquinas /

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top