2012-02-27 82 views
8

我試圖圍繞ScrollViewer的內容進行平移,方法與在PDF文檔中平移相同(滾動以放大/縮小,單擊並拖動以平移)ScrollViewer爲觸摸事件(PanningMode)內置了此功能,但是這似乎並未轉化爲Click + Drag事件。有沒有辦法告訴它/模擬這個功能?使用鼠標事件增益ScrollViewer的PanningMode行爲

回答

2

搖攝,通過實施的ScrollViewer四個虛擬方法內部啓用:

OnManipulationCompleted在 OnManipulationDelta在 OnManipulationInertiaStarting在 和OnManipulationStarting

都到哪兒去定義這些虛擬方法。讓我們走上層次結構。我們看到它在OnManipulationCompletedThunk中的UIElement上被調用(我確信其餘的方法也是相同的)。

在這一點上,一切仍然是私人的,我們希望挖掘一些東西。不幸的是,這是反射器和ILSpy失敗的原因(事實上它沒有,調用網站是在一個不同的DLL(PresentationCore),我沒有加載brb)。回來吧。一旦我們查看PresentationCore,我們有一個模糊的想法,即dependencyProperties是靜態註冊的,所以我們找到了.cctor。這裏有一些興趣點。

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

EventManager.RegisterClassHandler(typeof運算(的UIElement),ManipulationCompletedEvent,新事件處理程序(UIElement.OnManipulationCompletedThunk));

我們看到OnManipulationCompletedThunk是這個監聽ManipulationCompletedEvent的類處理程序的註冊回調。此外,ManipulationCompletedEvent最初並不是在UIElement上定義的,它是通過AddOwner從操縱靜態類中借用的。

做一個Manipulation類的搜索,我發現它在同一個程序集中的System.Windows.Input命名空間中。是公開的,是的。涼!所以此時我知道如果我觸發ManipulationCompletedEvent或它的任何好友,它最終會調用ScrollViewer。 http://msdn.microsoft.com/en-us/library/system.windows.input.manipulation.aspx

在這個公共靜態類的文檔中,我看到有一些有趣的和可能有用的方法。唯一不容易理解的是AddManipulator。這件事做什麼? Clicks .. reads .. oh,「每個接觸點都是一個IManipulator對象,例如,如果使用兩個手指來調整對象的大小,則會爲每個手指創建一個實現IManipulator的TouchDevice。」所以TouchDevice是一個IManipulator。也許這會給我一些關於如何創建我自己的操縱者的想法。

TouchDevice上的屬性給出了它支持的功能的一些線索。它有點像MouseDevice(具有捕獲的概念,DirectlyOver等),但它不支持以相同的方式進行操作。相反,我們希望對Mouse事件做出響應操作。讓我們看看TouchDevice是如何真正實現這些功能的。

方法TouchDevice正在執行是爲getPosition和ManipultionEnded

爲getPosition返回this.GetTouchPoint(對於relativeTo)。位置; 對於relativeTo是一個參數

ManipulationEnded電話OnManipulationEnded轉發名爲cancel一個布爾參數。不知道什麼取消了。哦,原來它沒有用,很奇怪,但確定。這基本上將捕獲設置爲空。在這裏的兔子洞結束Kindof所以我們必須備份和重新評估。

我真正想要做的是手工提高對UIElement的事件,看看它是否工作。 UIElement上的RaiseEvent方法應該適用於此。去試試brb。 Err等我錯過了一些東西,所有在Manipulation類上定義的事件都被標記爲內部。

顯然,這些事件僅僅意味着國內消費,以及短做反思我們沒有一個渠道存在。我想,也許使用操作特徵

是矯枉過正你想要做什麼。只需拖動事件和畫布就可以實現這一點。

此外,發現這個雖然谷歌搜索,並認爲它可能有一定的相關性http://multitouchvista.codeplex.com/