Đây là chuỗi các sự kiện:
- của bạn di chuyển chuột từ nơi mà bạn nhấp vào nó trên Panel. Không có sự kiện nào xảy ra.
- Con chuột của bạn đạt đến cạnh của Bảng và đi vào Canvas. Sự kiện
DragEnter
kích hoạt trên Canvas.
- Bộ xử lý
DragEnter
của bạn di chuyển Bảng điều khiển để nó bây giờ là dưới con chuột. Vì chuột không còn trên Canvas (nó nằm trên Bảng điều khiển), sự kiện DragLeave
sẽ kích hoạt.
- Con chuột của bạn di chuyển xa hơn, tiếp cận lại cạnh của Bảng điều khiển. Lặp lại bước 2 và 3.
Bạn di chuyển chuột càng nhanh thì càng có nhiều sự kiện bạn sẽ nhận được. Bản chất của vấn đề của bạn là việc kéo thả sử dụng thử nghiệm hit và bằng cách di chuyển bảng điều khiển của bạn, bạn sẽ đánh bại khả năng kiểm tra lần truy cập để xem "phía sau" bảng điều khiển của bạn để biết vùng chứa đang bị rơi vào.
Giải pháp là sử dụng mã của riêng bạn để xử lý kéo và thả, điều này thực sự không khó chút nào. Công cụ kiểm tra hit của WPF đủ mạnh để thực hiện kiểm tra hit phía sau đối tượng hiện tại nhưng kéo thả không sử dụng chức năng này. Tuy nhiên, bạn có thể sử dụng trực tiếp bằng cách sử dụng quá tải VisualTreeHelper.HitTest
mất HitTestFilterCallback
và HitTestResultCallback
. Chỉ cần vượt qua nó một bộ lọc mà bỏ qua bất kỳ số truy cập trong bảng điều khiển được kéo.
Tôi nhận thấy rằng đối với các kịch bản như bạn mô tả, việc kéo thả bằng cách xử lý sự kiện chuột thực sự dễ dàng hơn việc sử dụng DoDragDrop tích hợp vì bạn không phải đối phó với độ phức tạp (DataObject, DragDropEffects, QueryContinueDrag, v.v.) Sự phức tạp bổ sung này rất quan trọng để cho phép các tình huống kéo giữa các ứng dụng và các quy trình, nhưng không giúp bạn cho những gì bạn đang làm.
Đây là giải pháp đơn giản:
- On MouseDown với nút trái xuống, ghi lại vị trí (trên MouseLeave xóa vị trí)
- On MouseMove với {nút bên trái xuống, vị trí ghi, chuột hiện tại vị trí khác bởi nhiều hơn delta} thiết lập một cờ nói rằng hoạt động kéo đang được tiến hành & chụp chuột
- Trên MouseMove với thao tác kéo đang tiến hành, sử dụng thử nghiệm hit để xác định vị trí bảng điều khiển của bạn (bỏ qua bảng điều khiển) và điều chỉnh nuôi dạy con và vị trí phù hợp.
- On MouseUp với thao tác kéo cơ bản dở dang, nhả chụp chuột và rõ ràng là "hoạt động kéo là cơ bản dở dang" cờ
Thưởng thức.
Nguồn
2010-04-14 17:04:27
Bạn có thể nói cho chúng tôi biết bạn có thể đề xuất phương án thay thế. –
Tôi có một canvas với một loạt các Panels trên đó. Các bảng có thể được kéo xung quanh để sắp xếp lại chúng, hoặc các bảng mới có thể được thêm bằng cách kéo một bảng mới từ một hộp danh sách lên khung vẽ. Bạn cũng có thể xóa chúng bằng cách kéo các ô ra khỏi Canvas và quay lại Hộp danh sách. – Rachel