Хотя я не могу сказать вам точно, как передать свипы в сводку, я могу рассказать вам, как выполнить часть работы: как перехватить / проанализировать / отключить пользовательские жесты через WebBrowser.
Если я правильно помню, в 7.0:
- компонент WebBrowser состоял почти только из внутреннего TileHost, обернутого в некоторые сетки / границы
- , TileHost выполнял всю работу, связанную с обработкой касанияevents
- TileHost сделал это полностью внутренне (на собственном уровне), без .Net, видя какие-либо манипуляции-события (я думаю), или, по крайней мере, он игнорировал все попытки обработать / переопределить событие-манипуляциина верхнем слое.Класс WebBrowserInterop в этих вопросах был в основном пустым.
Теперь в 7.5, который у меня есть (может быть, и на 7.1 тоже, я не знаю), кажется, что MS действительно усердно работает над некоторым WebBrowser.проблемы манипуляции --- Я думаю, что они работают над тем, чтобы прокрутка / перелистывание полностью обрабатывались слоем .Net.Они написали специальный класс PanZoomContainer и внедрили их в VisualTree внутреннего шаблона WebBrowser.WebBrowserInterop был значительно обогащен множеством туннелей для уведомлений о событиях.WebBrowserInterop подключается к ManipulationEvents PanZoomContainer, а затем передает их на собственный слой.Кроме того, он прослушивает события / команды из собственного слоя, называемого, например, «ZoomAndScroll» или «ShowSIP», и в основном передает их обратно в PanZoomContainer.Идея кристально чистая правда?Они переписали обработку событий с полностью внутренней на небольшую часть спагетти, но добились прохождения их через PanZoomC.
Теперь, что это для меня / нас?
ЭтоPanZoomContainer, чьи Mani-события проверяются.TileHost не захватывает их сейчас.В этой версии элемента управления WebBrowser его VisualTree состоит из нескольких границ, сеток, PanZoomContainer и TileHost (средство визуализации).Это похоже на то:
WebBrowser
PanZoom
ContentPresenter
Border/Name="border" <- you want this one
TileHost
Я пропустил несколько границ и сеток, они в основном не имеют отношения к проблеме.Теперь, если прослушиваются Mani-события PanZoomContainer, давайте заблокируем их!
Используя VisualTreeHelper, просто копайте глубже и глубже, пока не найдете FrameworkElement.Name == "border".Эта граница оборачивает TileHost, который является «средством визуализации», занимающим 99% пространства элемента управления.Имейте в виду, что существует ContentPresenter, поэтому вам, возможно, придется подождать, пока будет создан экземпляр элемента управления (т. Е. Loaded / LayoutUpdated).
После того, как вы возьметесь за эту границу, присоедините к ней все обработчики Mani-Event:началось, дельта и закончено.PanZoom - это обычный элемент управления xaml / silverlight / .net / etc, поэтому он действительно подчиняется e.Handled = true :) Теперь, если вы хотите отключить ie.вертикальная прокрутка, фильтрация событий Delta и Completed для Translation.Y <> 0.Если вы хотите отключить касание, но оставить прокрутку / панорамирование - отфильтруйте X == 0 & Y == 0.
И это было самой легкой частью.
Сложная задача - поэкспериментировать с фильтрацией различных Start / Delta / Stop и настроить поведение в соответствии с вашими предпочтениями.
Хотя этоможет выглядеть очень красиво и заманчиво, это НЕ даст вам никаких реальных / хороших результатов легко.Например, я написал «если вы хотите отключить вертикальную прокрутку, то установите фильтр», если y == 0, то e.handled = true '».Большой?легко?Нет!
Предположим, мы хотим "отключить надувное горизонтальное панорамирование", оставив "вертикальную прокрутку".или наоборот, это только пример:
Вот небольшое прямоугольное устройство с чувствительным сенсорным экраном.Пожалуйста, сделайте такой вертикальный удар / панорамирование / перетаскивание на экране, чтобы полученное X-соединение было нулевым.Если вы установите такой фильтр, это будет практически невозможно для него должным образом.Ваши пользователи захотят убить вас за то, что вы заставили их повторить вертикальную прокрутку пять или более раз, пока они не совершат идеальное вертикальное движение.
Конечно, вы можете сделать это не == 0, но оставить небольшое поле. Хорошо. Но если вы сделаете запас слишком большим, система управления поймает промежуточное движение оси и также сделает крошечный горизонтальный панорамирование. После нескольких неудачных вертикальных движений общий горизонтальный панорамирование может накапливаться из этих небольших остатков, и может произойти смещение быть заметным.
Но есть и другие мерзкие побочные эффекты:
Говоря коротко, вы совершили e.Handled = true. Событие прошло. Мертв. Deased. если вы просто хотели, чтобы WebBrowser пропускал, например, горизонтальные пролистывания, чтобы внешний элемент управления (Pivot) замечал их и обрабатывал ..... упс. Событие прошло. Ранее TileHost / PanZoomC погасили события, теперь вы сделали это сами. Звучит как плохая шутка, а?
Благо:
- , поскольку вы прикрепили свои обработчики к самой нижней «границе», они могут не только блокировать события, но также могут прослушивать и публиковать их в других местах. То есть, если эти обработчики обнаруживают интересное движение, они могут e.Handled = true на нем, но в то же время они могут уведомлять ваши пользовательские объекты об этом обнаружении, и т. начать раскадровки.
- Мани-события под рукой, но есть и второй уровень, который слушает манипуляции: GestureListener / GestureService из набора инструментов Silverlight. Он сообщает о событиях после того, как они обрабатываются мани-событиями, но сообщает о них, не обращая внимания ни на какие e.Handled = true, которые были им установлены. Это совершенно отдельный механизм прослушивания жестов, и вы также можете использовать его для обнаружения манипуляций, которые были «отменены»
.. и вот так веселье идет и, может быть, даже немного дальше.