Wpf 使用鼠标事件获得ScrollViewer的平移模式行为

Wpf 使用鼠标事件获得ScrollViewer的平移模式行为,wpf,scrollviewer,panning,Wpf,Scrollviewer,Panning,我正试图用与在PDF文档中平移相同的方式来平移ScrollViewer的内容(滚动以放大/缩小,单击+拖动以平移)ScrollViewer内置了用于触摸事件(平移模式)的此功能,但这似乎不能转化为单击+拖动事件。有没有办法告诉它/模拟此功能?通过ScrollViewer实现的四种虚拟方法在内部启用平移: OnManipulationCompleted OnManipulationDelta OnManipulationInertiaStarting and OnManipulationStart

我正试图用与在PDF文档中平移相同的方式来平移ScrollViewer的内容(滚动以放大/缩小,单击+拖动以平移)ScrollViewer内置了用于触摸事件(平移模式)的此功能,但这似乎不能转化为单击+拖动事件。有没有办法告诉它/模拟此功能?

通过ScrollViewer实现的四种虚拟方法在内部启用平移:

OnManipulationCompleted
OnManipulationDelta
OnManipulationInertiaStarting
and OnManipulationStarting
那么这些虚拟方法是在哪里定义的呢。让我们进入层次结构。我们看到它是在OnManipulationCompletedThunk中的UIElement上调用的(我确信对于其余的部分也有相应的方法)

在这一点上,一切都是私有的,我们需要一些东西来利用。不幸的是,reflector和ILSpy在这一点上都让我失望(事实上它没有失败,调用站点位于不同的dll(PresentationCore)中,我没有加载brb)。好的,回来。在PresentationCore中查看后,我们模糊地认为dependencyProperties是静态注册的,因此我们找到了.cctor。这里有几条有趣的线路

操纵完成事件=操纵。操纵完成事件。添加所有者(typeof(UIElement))

RegisterClassHandler(typeof(UIElement)、操纵完成事件、新事件处理程序(UIElement.OnManipulationCompletedThunk))

我们看到OnManipulationCompletedThunk是侦听操纵CompletedEvent的类处理程序的注册回调。此外,最初并未在UIElement上定义OperationCompletedEvent,它是通过AddOwner从操纵静态类借用的

搜索操纵类时,我发现它位于同一程序集中的System.Windows.Input命名空间中。这是公开的吗,是的。酷!因此,在这一点上,我知道如果我触发操纵完成事件或它的任何伙伴,它最终将调用ScrollViewer

在这个公共静态类的文档中,我看到了一堆有趣且可能有用的方法。唯一不明显的是AddManipular。这东西做什么?点击。。读到。。哦,“每个触摸点都是一个IManipulator对象。例如,如果您使用两个手指调整对象的大小,则会为每个手指创建一个实现IManipulator的触摸设备。”因此,TouchDevice是一个IManipulator。也许这会让我知道如何创建自己的操纵器

TouchDevice上的属性为其支持的功能提供了一些线索。它有点像鼠标设备(有捕获、直接覆盖等概念),但它不支持以同样的方式进行操作。相反,我们希望对鼠标事件进行操作。让我们更仔细地看看TouchDevice,看看它是如何真正实现这些功能的

TouchDevice正在实现的方法是GetPosition和ManipultionEnded

GetPosition返回这个.GetTouchPoint(relativeTo).Position; relativeTo是一个参数

ManipulationEnded调用ManipulationEnded转发名为cancel的bool参数。我还不确定cancel能做什么。哦,原来没用过,很奇怪,但还好。这基本上将capture设置为null。这有点像兔子洞的尽头,所以我们得回去重新评估一下

我真正想做的就是在UIElement上手动引发事件,看看它是否有效。UIElement上的RaiseEvent方法应适用于此。我要试试brb。Err wait我遗漏了一些东西,操纵类上定义的所有事件都标记为内部事件

显然,这些活动只是为了内部消费,除了反思,我们没有任何途径

我认为也许使用操纵功能对你所要做的事情来说是过分的。可能有一种方法可以通过拖动事件和画布来实现这一点

另外,他在谷歌搜索时发现了这一点,并认为这可能有一定的相关性