事实证明,最后一个使用 javascript 的方法实际上工作得很好,问题是传递给 javascript 的双 x 和 y 值。将其转换为整数后,它检测到底层的 html 元素像素精确。
如果您想知道如何在 webbrowser 元素中将点击事件传输到网站,您需要执行以下操作:
将“LinqToVisualTree”添加到您的项目和文档中(fe:使用 LinqToVisualTree;)!
将此 javascript 代码添加到您的网站(除了 jquery):
function simulateClick(x, y) {
jQuery(document.elementFromPoint(x, y)).click();}
将 silverlight 工具包(搜索 GestureService 以获取信息)添加到您的解决方案中,并将此事件添加到 XAML 文件中的覆盖画布(放置在 webbrowser 元素上的画布元素)(例如,注意我也放在那里的画布。你将不得不用您自己的画布或网格或其他任何东西替换它:
<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 元素具有相同的大小!
而已。您现在拥有一个启用了点击功能的浏览器,但您可以将其余手势保留在本机应用程序中,并且浏览器不会捕捉到它们!从理论上讲,您可以重定向更多手势,但您需要有一个 javascript/jquery 函数可以“重新模拟”您想要传递的手势。