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