Элемент управления WP7 Pivot и элемент управления WebBrowser - PullRequest
2 голосов
/ 24 марта 2011

У меня есть Pivot, который содержит элемент управления WebBrowser, который практически занимает всю страницу (разумеется, начиная с заголовка Pivot).

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

Можно ли это сделать ??

Спасибо

Ответы [ 4 ]

4 голосов
/ 08 сентября 2011

Хотя я не могу сказать вам точно, как передать свипы в сводку, я могу рассказать вам, как выполнить часть работы: как перехватить / проанализировать / отключить пользовательские жесты через 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, которые были им установлены. Это совершенно отдельный механизм прослушивания жестов, и вы также можете использовать его для обнаружения манипуляций, которые были «отменены»

.. и вот так веселье идет и, может быть, даже немного дальше.

0 голосов
/ 18 июня 2014

Вызовите метод ниже и передайте свой метод как PivotControl x: name и WebBrowserControl x: name этому методу.

Здесь WebBrowserControl помещается во второй элемент сводки, т.е. Pivot Index равен 1, и я пытаюсьпроведите пальцем влево или вправо и дойдите до индекса поворота 2 или 1. соответственно.

public static void SwipteLeftRight(Microsoft.Phone.Controls.Pivot pivotControl, Microsoft.Phone.Controls.WebBrowser webBrowserControl)        
        {
            var gesListener = GestureService.GetGestureListener(webBrowserControl);
            gesListener.Flick += ((sen, args) =>
            {
                if (args.Direction == System.Windows.Controls.Orientation.Horizontal)
                {
                    if (args.HorizontalVelocity < 0)
                    {

                        if (((Microsoft.Phone.Controls.PivotItem)(pivotControl.SelectedItem)).Header.ToString().Trim() == "Pivot Item name")
                        {
                            pivotControl.SelectedIndex = 2; //Next Pivot item
                        }
                    }
                    else if (args.HorizontalVelocity > 0)
                    {

                        if ((Microsoft.Phone.Controls.PivotItem)(pivotControl.SelectedItem)).Header.ToString().Trim() == "Pivot Item name")
                        {
                            pivotControl.SelectedIndex = 0; // Previous Pivot Item
                        }
                    }
                }
            });
        }

Это сработало для меня.Приветствия

0 голосов
/ 24 марта 2011

Это похоже на размещение Карты в Сводке - которая обсуждается здесь - http://mine.tuxfamily.org/?p=111 - уже упоминалось в довольно многих вопросах - https://stackoverflow.com/search?q=mine.tuxfamily.org

В общем, совет основан на удобстве использования:

  • старайтесь не помещать элементы управления, использующие Touch, в PivotItem's

Кроме того, если вы просто используете элемент управления веб-браузера для очень небольшого количества статического html (поэтому вам вообще не нужна прокрутка), вы можете просто удалить HitTesting из веб-браузера.

0 голосов
/ 24 марта 2011

Я не знаю WP7 Pivot, но есть ли какие-либо события Preview * в элементе управления Pivot, которые позволяют обрабатывать касания и помечать их как обработанные?

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