使用webbrowser控件的ManipulationDelta事件来滚动列表框

时间:2013-03-26 17:19:51

标签: c# silverlight windows-phone-8

我在listBox中有多个webbrowser控件(Hierarchy:DataBoundListBox-> Multiple ExpandableItems->每个可展开项目在扩展时显示webbrowser控件。)。

问题是,webbrowser控件捕获拖动手势,一旦webbrowser控件展开,就无法滚动列表框。如果web浏览器的内容太长,则当web浏览器填满整个屏幕时,用户卡住并且不能再滚动。现在,webbrowser只需要响应简单的点击事件(按钮)。

webbrowser控件在内部捕获所有触摸手势和事件,但似乎有一个border元素,触摸事件可以在触摸手势到达tilehost之前被截获并且永远消失:< / p>

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

为了捕捉触摸手势,我向边框添加了一个ManipulationDelta事件,因为它不允许我添加像DragStartedDragDeltaDragCompleted这样的手势监听器事件。

现在我需要将此ManipulationDelta事件数据传送到浏览器所在的列表框内的scrollviewer。

这是一种有效的概念方法,是否有人能够帮助我如何运行?

PS:我反过来尝试过(将画布覆盖中的点击手势事件发送到webbrowser控制页面内的javascript并模拟页面上的点击)但这似乎不能很好地作为触摸坐标并且javascript坐标有一个未知的偏移量。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

事实证明,使用javascript的最后一个方法实际上工作得很好,问题是传递给javascript的双x和y值。在将其转换为整数后,它检测到底层html元素像素精确。

如果您想知道如何将点击事件传输到webbrowser元素中的网站,您需要执行以下操作:

将“LinqToVisualTree”添加到您的项目和文档中(f.e。:使用LinqToVisualTree;)!

将此javascript代码添加到您的网站(除了jquery):

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

将Silverlight工具包(搜索GestureService for info)添加到您的解决方案中,并将此事件添加到XAML文件中的覆盖画布(放置在webbrowser元素上的canvas元素)中(例如,请注意我放入的画布)你必须用自己的画布或网格或其他任何东西替换它:

<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元素的大小相同!

多数民众赞成。您现在有一个启用了tap的浏览器,但您可以将其余的手势保留在本机应用程序中,浏览器将无法捕获它们!从理论上讲,你可以重定向更多的手势,但你需要有一个javascript / jquery函数,它可以“重新模仿”你要传递的手势。