2013-03-26 2 views
0

У меня есть несколько элементов управления веб-браузером внутри listBox (Иерархия: DataBoundListBox-> Несколько расширяемых элементов-> Каждый расширяемый элемент показывает элемент управления веб-браузером при расширении.).Использование ManipulationDelta событие управления веб-браузером для прокрутки списка

Проблема заключается в том, что элемент управления веб-браузером захватывает жест перетаскивания, и невозможно прокручивать список после того, как элемент управления веб-браузера будет расширен. Если содержимое веб-браузера слишком длинное, пользователь застревает и больше не может прокручиваться, когда веб-браузер заполняет весь экран. Теперь веб-браузеру нужно только реагировать на простые события нажатия (кнопки).

управление WebBrowser захватывает все сенсорные жесты и событие внутри страны, но, кажется, что есть border элемента, где событие прикосновения может быть перехвачено прежде, чем сенсорные жесты достигает tilehost и навсегда:

Border border = WebViewer.Descendants<Border>().Last() as Border;

Чтобы зафиксировать жест касания, я добавил событие ManipulationDelta на границу, так как он не позволяет мне добавлять событие Gesture Listener, например DragStarted, DragDelta, DragCompleted.

Теперь мне нужно получить данные о событиях ManipulationDelta в scrollviewer внутри списка, где находится браузер.

Действительно ли это действительный концептуальный подход, и кто-нибудь может помочь мне в том, как это сделать?

PS: Я попробовал это наоборот (отправка событий жестов с помощью наложения холста на javascript внутри страницы управления веб-браузером и имитация крана на странице), но это не работает очень хорошо, как прикосновение координаты и координаты javascript имеют неизвестное смещение.

Спасибо за помощь!

+0

Вы можете опубликовать это как ответ на свой вопрос. –

+0

Сделал так. Я так удивлен, что это работает, я надеюсь, что это поможет и другим людям. –

ответ

1

Оказалось, что последний метод с javascript действительно работал достаточно хорошо, проблема заключалась в двойном значении x и y, которое было передано в javascript. После преобразования его в целое число, он обнаружил, что базовый пиксель элемента html является точным.

Если вы хотите знать, как вы можете перенести крана события на веб-сайт в WebBrowser элемент, вам нужно сделать следующее:

Добавить «LinqToVisualTree» в ваш проект и документ (ФЭ: использование LinqToVisualTree;)!

Добавить яваскрипт кода на свой веб-сайт (помимо JQuery):

function simulateClick(x, y) { 
jQuery(document.elementFromPoint(x, y)).click();} 

Добавить SilverLight инструментария (поиск GestureService для информации) к вашему решению и добавить это событие наложения холста (брезентовый элемент, который . помещенный над элементом WebBrowser) в файле XAML (например, обратите внимание на холст я помещал также там Вам придется заменить его собственным холст или сеткой или что-то:

<Canvas> 
    <toolkit:GestureService.GestureListener> 
     <toolkit:GestureListener Tap="GestureListener_Tap"/> 
    </toolkit:GestureService.GestureListener> 
</Canvas> 

Добавьте это в файл XAML codebehind C# (обратите внимание, что я немного переработал вы можете изменить номер 1.3499. Это статическое смещение фактор кнопок на эмуляторе).

private void GestureListener_Tap(object sender, Microsoft.Phone.Controls.GestureEventArgs e) 
    { 
     Canvas cv = sender as Canvas; 
     //!!! You need to change the following search for the webbrowser to your own xaml structure. 
     // It uses "LinqToVisualTree" to find the element! Add it to your document! 
     WebBrowser wb = cv.Ancestors<Grid>().First().ElementsBeforeSelf<WebBrowser>().First() as WebBrowser; 
     var gesture = e.GetPosition(cv); 
     var gx = gesture.X; 
     var gy = gesture.Y; 
     tapBrowser(wb, gx, gy); 
    } 

    private static void tapBrowser(WebBrowser wb, double x, double y) 
    { 
     GeneralTransform gt = wb.TransformToVisual(Application.Current.RootVisual as UIElement); 
     Point offset = gt.Transform(new Point(0, 0)); 
     double rx = (x/1.3499); 
     double ry = (y/1.3499); 
     int ix = (int)rx; 
     int iy = (int)ry; 
     wb.InvokeScript("simulateClick", ix.ToString(), iy.ToString()); 
    } 

Убедитесь, что ваш холст имеет тот же размер, что и элемент WebBrowser!

Thats it. Теперь у вас есть браузер с включенным краном, но вы можете сохранить остальные жесты внутри собственного приложения, и браузер не поймает их! Теоретически, вы можете перенаправить больше жестов, но вам нужно иметь функцию javascript/jquery, которая может «сгладить» жест, который вы хотите передать.

Смежные вопросы