Получите поведение ScrollViewer для PanningMode с помощью событий мыши - PullRequest
9 голосов
/ 27 февраля 2012

Я пытаюсь перемещаться по содержимому ScrollViewer так же, как и при перемещении по документу PDF (прокрутка для увеличения / уменьшения, нажатие + перетаскивание для панорамирования) ScrollViewer имеет эту функцию, встроенную для сенсорных событий.(PanningMode), однако это не похоже на события Click + Drag.Есть ли способ сказать / эмулировать эту функцию?

1 Ответ

2 голосов
/ 21 ноября 2012

Панорамирование включается внутренне четырьмя виртуальными методами, реализованными ScrollViewer:

OnManipulationCompleted OnManipulationDelta OnManipulationInertiaStarting и OnManipulationStarting

Так, где эти виртуальные методы определены.Пройдемся по иерархии.Мы видим, что он вызывается для UIElement в OnManipulationCompletedThunk (я уверен, что для остальных также есть сопутствующие методы).

На данный момент все еще приватно, мы хотим что-то использовать.К сожалению, это тот момент, когда рефлектор и ILSpy подвели меня (ну, на самом деле это не так, сайт вызова находится в другой dll (PresentationCore), которую я не загрузил brb).Хорошо назад.Как только мы смотрим в PresentationCore, у нас есть смутное представление о том, что dependencyProperties регистрируются статически, поэтому мы находим .cctor.Здесь есть пара интересных интересов:

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

и

EventManager.RegisterClassHandler (typeof (UIElement), ManipulationCompletedEvent, new EventHandler (UIElement.OnManipulationCompletedThunk));

Мы видим, что OnManipulationCompletedThunk является зарегистрированным обратным вызовом для этого обработчика класса, который прослушивает ManipulationCompletedEvent.Кроме того, ManipulationCompletedEvent изначально не определено в UIElement, оно заимствовано из статического класса Manipulation через AddOwner.

Выполняя поиск класса Manipulation, я вижу, что он находится в пространстве имен System.Windows.Input в той же сборке.Это публично, да.Здорово!поэтому в этот момент я знаю, что если я запустлю ManipulationCompletedEvent или любого из его собеседников, он в конечном итоге вызовет ScrollViewer.http://msdn.microsoft.com/en-us/library/system.windows.input.manipulation.aspx

В документации этого открытого статического класса я вижу множество интересных и, возможно, полезных методов.Единственный, который не совсем очевиден - это AddManipulator.Что эта штука делает?Щелчки ... читает ... о, "каждая точка касания является объектом IManipulator. Например, если вы используете два пальца для изменения размера объекта, TouchDevice, который реализует IManipulator, создается для каждого пальца".Так что TouchDevice - это IManipulator.Возможно, это даст мне некоторое представление о том, как создать мой собственный манипулятор.

Свойства на TouchDevice дают некоторое представление о функциях, которые он поддерживает.Он похож на MouseDevice (имеет концепцию захвата, DirectlyOver и т. Д.), Но он не поддерживает манипуляции таким же образом.Скорее мы хотим сделать Манипуляции в ответ на события мыши.Давайте посмотрим на TouchDevice более тщательно, чтобы увидеть, как он действительно реализует некоторые из этих функций.

Методы, которые реализует TouchDevice: GetPosition и ManipultionEnded

GetPosition возвращает this.GetTouchPoint (lativeTo) .Position;lativeTo - это параметр

. ManipulationEnded вызывает OnManipulationEnded, перенаправляя параметр bool с именем cancel.Не уверен, что отмена делает еще.о, оказывается, это не используется, странно, но хорошо.Это в основном устанавливает захват к нулю.Kindof в конце кроличьей норы здесь, поэтому мы должны сделать резервную копию и переоценить.

Все, что я действительно хочу сделать, это инициировать события вручную в UIElement и посмотреть, работает ли он.Для этого должен работать метод RaiseEvent в UIElement.собираюсь попробовать брб.Подождите, я что-то пропустил, все события, определенные в классе Manipulation, помечены как внутренние.

Очевидно, что эти события предназначены только для внутреннего потребления, и если не считать размышлений, у нас там нет пути.

Я думаю, что, возможно, использование функции манипуляции является излишним для того, что вы пытаетесь сделать.Вероятно, есть способ реализовать это с помощью только события перетаскивания и холста.

Кроме того, нашел это во время поиска в Google и подумал, что это может иметь какое-то отношение http://multitouchvista.codeplex.com/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...