運行時可拖動的 Button,拖動過程會觸發 Click 事件,需抑制。
在 MouseDown 和 MouseMove 中暫時取消 Click 事件訂閱,MouseUp 恢復:
private Point _dragStart;
private void btn_MouseDown(object sender, MouseEventArgs e) {
_dragStart = e.Location;
btn.Click -= Btn_Click; // 取消
}
private void btn_MouseMove(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
btn.Click -= Btn_Click; // 確保取消
btn.Location = new Point(btn.Left + e.X - _dragStart.X,
btn.Top + e.Y - _dragStart.Y);
}
}
private void btn_MouseUp(object sender, MouseEventArgs e) {
_dragStart = e.Location;
btn.Click += Btn_Click; // 恢復
}
原理:拖動屬於連續移動操作,非點擊意圖,臨時移除 Click 處理器避免誤觸發。