Ben*_* K. 9 wpf scrollviewer panning
我试图以与在PDF文档中平移相同的方式平移ScrollViewer的内容(滚动到放大/缩小,单击+拖动以平移)ScrollViewer具有为触摸事件内置的此功能(PanningMode) ,但这似乎并没有转化为Click + Drag事件.有没有办法告诉它/模仿这个功能?
平移是通过 ScrollViewer 实现的四个虚拟方法在内部启用的:
OnManipulationCompleted
OnManipulationDelta
OnManipulationInertiaStarting
and OnManipulationStarting
Run Code Online (Sandbox Code Playgroud)
那么这些虚方法是在哪里定义的呢?让我们向上提升层次结构。我们看到它在 OnManipulationCompletedThunk 中的 UIElement 上被调用(我确信其余的方法也有相应的方法)。
此时一切仍然是私有的,我们想要一些东西可以利用。不幸的是,这就是 Reflector 和 ILSpy 都让我失败的地方(事实上并没有,调用站点位于另一个我没有加载 brb 的 dll (PresentationCore) 中)。好的回来。一旦我们查看PresentationCore,我们就会有一个模糊的想法:dependencyProperties 是静态注册的,因此我们找到了.cctor。这里有几行有趣的内容。
ManipulationCompletedEvent = Manipulation.ManipulationCompletedEvent.AddOwner(typeof(UIElement));
和
EventManager.RegisterClassHandler(typeof(UIElement), ManipulationCompletedEvent, new EventHandler(UIElement.OnManipulationCompletedThunk));
我们看到 OnManipulationCompletedThunk 是监听 ManipulationCompletedEvent 的此类处理程序的注册回调。另外,ManipulationCompletedEvent 最初并不是在 UIElement 上定义的,它是通过 AddOwner 从 Manipulation 静态类借用的。
在搜索 Manipulation 类时,我发现它位于同一程序集中的 System.Windows.Input 命名空间中。是公开的吗,是的。凉爽的!所以此时我知道,如果我触发 ManipulationCompletedEvent 或其任何伙伴,它最终会调用 ScrollViewer。http://msdn.microsoft.com/en-us/library/system.windows.input.manipulation.aspx
在这个公共静态类的文档中,我看到有很多有趣且可能有用的方法。唯一不太明显的是 AddManipulator。这个东西有什么作用?点击..读取..哦,“每个触摸点都是一个 IManipulator 对象。例如,如果您使用两个手指调整对象的大小,则会为每个手指创建一个实现 IManipulator 的 TouchDevice。” 所以 TouchDevice 是一个 IManipulator。也许这会让我了解如何创建自己的操纵器。
TouchDevice 上的属性提供了有关其支持的功能的一些线索。它有点像 MouseDevice(具有捕获、DirectlyOver 等概念),但它不支持以相同方式进行操作。相反,我们想要进行操作来响应鼠标事件。让我们仔细看看 TouchDevice,看看它是如何真正实现其中一些功能的。
TouchDevice 正在实现的方法是 GetPosition 和 ManipultionEnded
GetPosition 返回 this.GetTouchPoint(relativeTo).Position; relativeTo 是一个参数
ManipulationEnded 调用 OnManipulationEnded 转发名为 cancel 的 bool 参数。还不确定取消会做什么。哦,原来没有用过,奇怪但还好。这基本上将 capture 设置为 null。有点像兔子洞的尽头,所以我们必须备份并重新评估。
我真正想做的就是在 UIElement 上手动引发事件并查看它是否有效。UIElement 上的 RaiseEvent 方法应该适用于此。要去尝试brb。呃等等,我错过了一些东西,在 Manipulation 类上定义的所有事件都被标记为内部事件。
显然,这些事件仅供内部使用,如果不进行反思,我们就没有途径。
我认为使用操纵功能对于您想要做的事情来说可能有点过分了。可能有一种方法只需拖动事件和画布即可实现此目的。
另外,在谷歌搜索时发现了这一点,并认为它可能具有一定的相关性http://multitouchvista.codeplex.com/
| 归档时间: |
|
| 查看次数: |
2268 次 |
| 最近记录: |