ドラッグ可能なコントロール (A) があり、その中にボタンがあります。A には他のコントロールもあります。つまり、ボタンは A を埋めません。
ドラッグ機能を管理するために、コントロール (A) はすべてのMouseDownイベントをキャプチャします。その後、マウスの移動距離に基づいてドラッグを開始するかどうかを決定します。
ボタンがクリックMouseUpされ、ドラッグが開始される前にイベントが受信された場合、ボタンのイベントが発生するようにしたいと思いますClick。
現時点では、MouseUpイベントは親コントロール (A) によってキャプチャされるため、これは発生しません。これを手動で処理するために、 A に機能を実装できます。
private void MouseUp(object sender, MouseEventArgs e) {
if (DragHasStarted) {
DealWithDrag();
}
else {
DelegateToChildControls();
}
}
DelegateToChildControlsただし、どの子に委譲するかを決める必要があるため、これは複雑で、うまくスケーリングできません。
親コントロールがイベントを処理しない場合、Windows にこれを処理させ、ボタンの Click メソッドを直接呼び出す方法はありMouseUpますか?
編集 - イベント シーケンスの詳細:
ボタンをクリックすると、次の一連のイベントが表示されます。
MouseDownオンボタンMouseDownon Button (ドラッグ ハンドラ)- これをボタンの親に転送します
MouseDown親 (ドラッグ ハンドラ)- 親によってキャプチャされたマウス (ドラッグ ハンドラ)
MouseUp親に- ドラッグの終了 (ドラッグ ハンドラ)
MouseUpボタンにイベントが表示されません。