javascriptを使用した最後のメソッドは実際には非常にうまく機能していたことがわかりました。問題は、javascriptに渡されたxとyの値が2つあることでした。整数に変換した後、基になるhtml要素のピクセルを正確に検出しました。
タップイベントをwebbrowser要素のWebサイトに転送する方法を知りたい場合は、次のことを行う必要があります。
プロジェクトとドキュメントに「LinqToVisualTree」を追加します(fe:LinqToVisualTreeを使用;)!
このjavascriptコードをWebサイトに追加します(jquery以外):
function simulateClick(x, y) {
jQuery(document.elementFromPoint(x, y)).click();}
ソリューションにsilverlightツールキット(情報についてはGestureServiceを検索)を追加し、このイベントをXAMLファイルのオーバーレイキャンバス(webbrowser要素の上に配置されるcanvas要素)に追加します(たとえば、そこに配置したキャンバスにも注意してください。独自のキャンバスやグリッドなどに置き換える必要があります。
<Canvas>
<toolkit:GestureService.GestureListener>
<toolkit:GestureListener Tap="GestureListener_Tap"/>
</toolkit:GestureService.GestureListener>
</Canvas>
これをc#の後ろのxamlファイルコードに追加します(タップから元の座標を少し再計算したことに注意してください。数値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関数が必要です。