.Netでシングルクリックとダブルクリックを区別するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/218555

  •  03-07-2019
  •  | 
  •  

質問

OnMouseClickとOnMouseDoubleClickをオーバーライドし、使用されたクリックスタイルに応じて異なるアクションを実行したい。

問題は、シングルクリックとダブルクリックの両方でOnMouseClickが発生し、OnMouseDoubleClickの前に呼び出されることです。

これは一般的な要件であるに違いないので、かなり明らかなものが欠けていると思います。誰かが私を埋めることができますか?

追加して編集:MouseEventArgs.Clicksカウントは役に立ちません。ダブルクリックの場合、最初のクリックは、MouseEventArgs.Clicks == 1のOnMouseClickでのシングルクリックとして処理されます。

追加して編集:オブジェクトは画像のサムネイルです。シングルクリックで、エクスポートの選択のオンとオフを切り替えます。ダブルクリックすると、サムネイルが全画面表示されます。選択と「アクティベーション」アクションは直交しています。これは、2つのアクションの根本的な問題を示している可能性があります...

乾杯、 ロブ

役に立ちましたか?

解決

これはWindows全体で発生します。 .Netでそれを処理するために特別なものを追加したとは思わない。

これを処理する通常の方法は

  • a)シングルクリックするだけ あなたはダブルの前に起こりたいだろう 選択のようにクリックします。
  • b)オプションでない場合、クリックイベントでタイマーを開始します。タイマーの目盛りで、シングルクリックアクションを実行します。最初にダブルクリックイベントが発生した場合は、タイマーを終了し、ダブルクリックアクションを実行します。

時間を設定する時間は、システムのダブルクリック時間(ユーザーがコントロールパネルで指定できる時間)と等しくする必要があります。 System.Windows.Forms.SystemInformation.DoubleClickTimeから入手できます。詳細は、MSDNのこちら

にあります。

他のヒント

問題は、ほとんどのオブジェクトが両方を実装していないことです。通常、シングルクリックとダブルクリックで合理的に異なるアクションを持つことができる少数のオブジェクトは、ダブルクリックアクションの前にシングルクリックアクションを実行しても問題ありません(強調表示してからフォルダーを開き、アドレスバーにフォーカスを入力して選択するなど)。判断する方法は、おそらくシングルクリックを一定時間待機し、ダブルクリックが検出された場合はシングルクリックのアクションをキャンセルすることです。

別の可能な解決策は、OnMouseDoubleClick関数でOnMouseClickを呼び出すことです。 OnMouseClickのアクションはバイナリトグルであるため、2回呼び出すと同じ状態にリセットされます。

ユーザーがダブルクリックすると、WindowsはOnMouseClickを呼び出し、次にOnMouseDoubleClickを呼び出します。 OnMouseDoubleClickは(再び)OnMouseClickを呼び出して状態を復元し、ダブルクリックを処理します。

これは解決策として不満を感じますが、機能します。

(ダブルクリックの最初のクリックを飲み込むために)タイマーを使用することも同様に不満であり、ユーザーのダブルクリック率の設定を処理する複雑さが追加されます。

乾杯、 ロブ

OnMouseClickイベントハンドラー内でタイマーを開始できます。

  • タイマーがタイムアウトした場合(300ミリ秒など)、シングルクリックが意図されます。

その他

  • タイムアウト前に別のOnMouseClickイベントが生成された場合、クリックのxおよびy位置を調べて、最初のクリックの特定の半径内にある場合、ダブルクリック機能を実行します。

それ以外の場合

  • 最初のクリックを処理し、2回目のクリックでタイマーを再初期化します

NB:この実装には、timeoputと 'double-click' radiusの両方をシステム構成から独立して構成できるという利点があり、ソフトウェアを複数のマシンにインポートできます/

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top