2012-02-27 11 views
8

Tôi đang cố gắng xoay quanh nội dung của ScrollViewer giống như cách bạn xoay quanh trong tài liệu PDF (cuộn để phóng to/thu nhỏ, nhấp + kéo để cuộn) ScrollViewer có chức năng này được tích hợp sẵn cho các sự kiện Chạm (PanningMode), tuy nhiên điều này dường như không dịch sang các sự kiện Nhấp + Kéo. Có cách nào để cho nó biết/thi đua chức năng này?Tăng hành vi PanningMode của ScrollViewer với các sự kiện chuột

Trả lời

2

Panning được kích hoạt trong nội bộ của bốn phương pháp ảo thực hiện bởi ScrollViewer:

OnManipulationCompleted OnManipulationDelta OnManipulationInertiaStarting và OnManipulationStarting

Vì vậy, nơi là những phương pháp ảo xác định. Cho phép đi lên hệ thống phân cấp. Chúng tôi thấy rằng nó được gọi là trên UIElement trong OnManipulationCompletedThunk (Tôi chắc chắn có những phương pháp đồng thời cho phần còn lại là tốt).

Mọi thứ vẫn ở chế độ riêng tư tại thời điểm này, chúng tôi muốn có thứ gì đó để khai thác. Thật không may đây là điểm mà cả hai phản xạ và ILSpy thất bại tôi (cũng thực sự nó không, các trang web gọi là trong một dll khác nhau (PresentationCore) mà tôi không có tải brb). Ok quay lại. Khi chúng ta nhìn vào PresentationCore, chúng ta có một ý tưởng mơ hồ rằng dependencyProperties được đăng ký tĩnh, vì vậy chúng ta tìm thấy .cctor. Có một vài dòng quan tâm ở đây.

ManipulationCompletedEvent = Manipulation.ManipulationCompletedEvent.AddOwner (typeof (UIElement));

EventManager.RegisterClassHandler (typeof (UIElement), ManipulationCompletedEvent, EventHandler mới (UIElement.OnManipulationCompletedThunk));

Chúng tôi thấy rằng OnManipulationCompletedThunk là cuộc gọi lại đã đăng ký cho trình xử lý lớp này để nghe ManipulationCompletedEvent. Ngoài ra, ManipulationCompletedEvent không được định nghĩa ban đầu trên UIElement, nó được mượn từ lớp tĩnh Manipulation thông qua AddOwner.

Thực hiện tìm kiếm lớp Thao tác, tôi thấy rằng nó nằm trong không gian tên System.Windows.Input trong cùng một assembly. Có công khai không? Mát mẻ! vì vậy tại thời điểm này tôi biết rằng nếu tôi bắn ManipulationCompletedEvent hoặc bất kỳ người bạn nào của nó, nó cuối cùng sẽ gọi vào ScrollViewer. http://msdn.microsoft.com/en-us/library/system.windows.input.manipulation.aspx

Trong tài liệu cho lớp tĩnh công khai này, tôi thấy có một loạt các phương pháp thú vị và hữu ích. Người duy nhất không rõ ràng là AddManipulator. Điều này làm gì? Nhấp chuột .. đọc .. oh, "Mỗi điểm tiếp xúc là một đối tượng IManipulator. Ví dụ, nếu bạn sử dụng hai ngón tay để thay đổi kích thước một đối tượng, một TouchDevice, mà thực hiện IManipulator, được tạo ra cho mỗi ngón tay." Vì vậy, TouchDevice là một IManipulator. Có lẽ điều đó sẽ cho tôi một số ý tưởng về cách tạo ra kẻ thao túng của riêng tôi.

Thuộc tính trên TouchDevice cung cấp một số đầu mối về các tính năng mà nó hỗ trợ. Nó giống như một MouseDevice (có khái niệm chụp, DirectlyOver vv), nhưng nó không hỗ trợ thao tác theo cùng một cách. Thay vào đó chúng ta muốn thực hiện thao tác để đáp ứng với các sự kiện chuột. Cho phép nhìn kỹ hơn tại TouchDevice để xem nó thực sự thực hiện một số tính năng như thế nào.

Các phương pháp TouchDevice đang triển khai là GetPosition và ManipultionEnded

GetPosition trả this.GetTouchPoint (relativeTo).Chức vụ; relativeTo là một tham số

Thao tácThuộc gọi được gọi OnManipulationEnded forwarding một tham số bool có tên hủy. Bạn chưa chắc chắn hủy bỏ gì. oh, hóa ra nó không được sử dụng, kỳ lạ nhưng ok. Điều này về cơ bản thiết lập chụp để null. Ở cuối lỗ thỏ ở đây, chúng tôi sẽ phải sao lưu và đánh giá lại.

Tất cả những gì tôi thực sự muốn làm là tăng sự kiện theo cách thủ công trên UIElement và xem liệu nó có hoạt động hay không. Phương thức RaiseEvent trên UIElement nên làm việc cho việc này. sẽ thử brb. Err chờ đợi tôi bỏ lỡ một cái gì đó, tất cả các sự kiện được xác định trên lớp Manipulation được đánh dấu là nội bộ.

Rõ ràng những sự kiện này chỉ có nghĩa là để tiêu thụ nội bộ và thiếu phản ánh chúng tôi không có đại lộ ở đó.

Tôi nghĩ có thể sử dụng tính năng Thao tác là quá mức cần thiết cho những gì bạn đang cố gắng làm. Có thể là một cách để thực hiện điều này chỉ với sự kiện kéo và khung vẽ.

Ngoài ra, tìm thấy điều này trong khi googling và nghĩ rằng nó có thể có một số liên quan http://multitouchvista.codeplex.com/