C# 使用webbrowser控件的操纵增量事件滚动列表框

C# 使用webbrowser控件的操纵增量事件滚动列表框,c#,silverlight,windows-phone-8,C#,Silverlight,Windows Phone 8,我在一个列表框中有多个webbrowser控件(层次结构:DataBoundListBox->multiple ExpandableItems->每个可展开项在展开时显示一个webbrowser控件) 问题是,webbrowser控件捕获拖动手势,一旦webbrowser控件展开,就不可能滚动列表框。如果webbrowser的内容过长,则当webbrowser填满整个屏幕时,用户会被卡住,无法再滚动。现在,webbrowser只需要响应简单的点击事件(按钮) webbrowser控件在内部捕获所

我在一个列表框中有多个webbrowser控件(层次结构:DataBoundListBox->multiple ExpandableItems->每个可展开项在展开时显示一个webbrowser控件)

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

webbrowser控件在内部捕获所有触摸手势和事件,但似乎有一个
边框
元素,可以在触摸手势到达
tilehost
并永远消失之前拦截触摸事件:

Border Border=WebViewer.subjects().Last()作为边框

为了捕捉触摸手势,我向边框添加了一个操纵增量事件,因为它不允许我添加手势侦听器事件,如
DragStarted
DragDelta
DragCompleted

现在,我需要将这个操纵增量事件数据发送到浏览器所在的列表框内的scrollviewer

这是一种有效的概念性方法吗?有人能帮助我如何运行它吗

注意:我尝试了另一种方法(将点击手势事件从画布覆盖发送到webbrowser控制页面内的javascript,并模拟页面上的点击),但这似乎效果不太好,因为触摸坐标和javascript坐标有未知的偏移量


谢谢你的帮助

最后一个使用javascript的方法实际上运行得很好,问题是传递给javascript的双x和y值。将其转换为整数后,它检测到底层html元素pixel precise

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

将“LinqToVisualTree”添加到项目和文档中(例如:使用LinqToVisualTree;)

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

将silverlight toolkit(search for GestureService for info)添加到您的解决方案中,并将此事件添加到XAML文件中的覆盖画布(位于webbrowser元素上方的画布元素)中(例如,请注意我放在其中的画布。您必须将其替换为您自己的画布或网格或其他内容:

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

将其添加到xaml文件codebhind c#(注意,我在点击时重新计算了原始坐标,您可能需要更改数字1.3499。这是模拟器上按钮的静态偏移系数。):

private void GestureListener_点击(对象发送方,Microsoft.Phone.Controls.GestureEventArgs e)
{
Canvas cv=发送者作为画布;
//!!!您需要将以下webbrowser搜索更改为您自己的xaml结构。
//它使用“LinqToVisualTree”查找元素!将其添加到文档中!
WebBrowser wb=cv.祖先().First().ElementsBeforeSelf().First()作为WebBrowser;
var手势=e.GetPosition(cv);
var gx=手势.X;
var-gy=手势.Y;
tapBrowser(wb、gx、gy);
}
专用静态浏览器(WebBrowser wb、双x、双y)
{
GeneralTransform gt=wb.TransformToVisual(Application.Current.RootVisual作为UIElement);
点偏移=gt.变换(新点(0,0));
双rx=(x/1.3499);
双y=(y/1.3499);
int ix=(int)rx;
int-iy=(int)ry;
wb.InvokeScript(“simulateClick”,ix.ToString(),iy.ToString());
}
确保画布的大小与webbrowser元素相同


就是这样。你现在有了一个支持点击的浏览器,但你可以将其余的手势保留在本机应用程序中,浏览器不会捕捉到它们!理论上,你可以重定向更多手势,但你需要有一个javascript/jquery功能,可以“重模拟”你想传递的手势。

你可以把它作为你自己问题的答案发布。我这么做了。我很惊讶它能起作用,我希望它也能帮助其他人。
<Canvas>
    <toolkit:GestureService.GestureListener>
        <toolkit:GestureListener  Tap="GestureListener_Tap"/>
    </toolkit:GestureService.GestureListener>
</Canvas>
    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());
    }