0

リストボックス内に複数のWebブラウザーコントロールがあります(階層:DataBoundListBox-> Multiple ExpandableItems->各拡張可能アイテムは拡張時にWebブラウザーコントロールを表示します)。

問題は、Webブラウザコントロールがドラッグジェスチャをキャプチャし、Webブラウザコントロールが展開されるとリストボックスをスクロールできないことです。Webブラウザーのコンテンツが長すぎると、ユーザーはスタックし、Webブラウザーが画面全体に表示されるため、スクロールできなくなります。これで、Webブラウザーは、単純なタップイベント(ボタン)に応答するだけで済みます。

Webブラウザコントロールはすべてのタッチジェスチャとイベントを内部でキャプチャしますが、タッチジェスチャがに到達して永久に消えるborder前にタッチイベントをインターセプトできる要素があるようです。tilehost

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

タッチジェスチャをキャプチャするために、境界にManipulationDeltaイベントを追加しました。これは、、、などDragStartedのジェスチャリスナーイベントを追加できないためです。DragDeltaDragCompleted

次に、このManipulationDeltaイベントデータを、ブラウザーが配置されているリストボックス内のscrollviewerに取得する必要があります。

これは有効な概念的アプローチであり、誰かがこれを実行する方法について私を助けることができますか?

PS:逆に試してみました(キャンバスオーバーレイからwebbrowserコントロールページ内のjavascriptにタップジェスチャイベントを送信し、ページのタップをシミュレートします)が、これはタッチ座標とjavascriptほどうまく機能していないようです座標には不明なオフセットがあります。

手伝ってくれてありがとう!

4

1 に答える 1

1

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関数が必要です。

于 2013-03-28T23:12:02.720 に答える