1

ブロブが望ましくないイベントをトリガーするように見えるため、指以外のタッチを無視できるように、Surface の WPF で TouchDevices を排除しようとしています。
最初に私はこのような単純なものを持っていました

private void SurfaceWindow1_PreviewTouchDown(object sender, TouchEventArgs e)
    {
        if (!e.TouchDevice.GetIsFingerRecognized() && InteractiveSurface.PrimarySurfaceDevice.IsFingerRecognitionSupported == true)
        {
            e.Handled = true;
        }

    }

これは、ScatterViewItems 内や操作などとのタッチ操作を停止するのに適しています。ただし、PreviewTouchDown の前に別の処理が必要です。BLOB を使用して SVI をアクティブ化し、それを一番上に表示することができますが、他の操作は行われません。SVI の TouchEnter はまだ表示され、それを前に進めていると思いますが、すべての要素で TouchEnter を処理しても同じことが起こるので、まだ何か他のことが起こっています。

Touch.FrameReported を調べましたが、SVI が通知する前に適切な TouchCaptures を解放できません。

    private void myTouchFrameHandler(object sender, TouchFrameEventArgs e)
    {
        foreach (TouchPoint _tp in e.GetTouchPoints(this)) {
            if (!_tp.TouchDevice.GetIsFingerRecognized())
            {
                this.ReleaseAllTouchCaptures();    
            }
        }
    }

何か案は?
ありがとう

4

3 に答える 3

2

私は同じ問題に出くわし、ScatterViewItemsに付属の動作を実装しました。この動作は、自動 IsTopmostOnActivation 動作を無効にし、PreviewTouchDown イベントをリッスンして、テスト条件に基づいてアイテムを最前面に移動するかどうかを決定します。使いやすいアクティベーション方法を備えています

CustomTopmostBehavior.Activate();

これにより、すべての ScatterViewItem の動作を有効にするアプリケーション全体のスタイルが追加されます。

この動作は、デフォルトである TestCondition プロパティを設定することでカスタマイズできます。

CustomTopmostBehavior.TestCondition = (t) =>
{
    return t.GetIsFingerRecognized();
};
于 2012-03-18T13:09:51.647 に答える
1

ここでは、タッチが指として認識されないときにタッチが進むのを止め、ホバーしたときに SVI が上に上がらないようにするための私の汚い回避策を示します。

    this.PreviewTouchDown += new EventHandler<System.Windows.Input.TouchEventArgs>(SurfaceWindow1_PreviewTouchDown);    
    SVI.TouchEnter += new EventHandler<TouchEventArgs>(SVI_TouchEnter);
    SVI.TouchLeave +=new EventHandler<TouchEventArgs>(SVI_TouchLeave);

    void SurfaceWindow1_PreviewTouchDown(object sender, System.Windows.Input.TouchEventArgs e)
    {

        if (!e.TouchDevice.GetIsFingerRecognized() && Microsoft.Surface.Presentation.Input.InteractiveSurface.PrimarySurfaceDevice.IsFingerRecognitionSupported) { e.Handled = true; }
        else
        {
           //normal stuff
        }



    }
    private void SVI_TouchEnter(object sender, TouchEventArgs e)
    {
        ScatterViewItem svi = sender as ScatterViewItem;

        if (!e.TouchDevice.GetIsFingerRecognized() && Microsoft.Surface.Presentation.Input.InteractiveSurface.PrimarySurfaceDevice.IsFingerRecognitionSupported == true)
        {
            svi.IsTopmostOnActivation = false;
            e.Handled = true;
        }
        else
        {
            foreach(ScatterViewItem svi in mainScatterView.Items.SourceCollection){
                svi.IsTopmostOnActivation = false;
            }

            SVI.IsTopmostOnActivation = true;
        }

    }
    private void SVI_TouchLeave(object sender, TouchEventArgs e)
    {
            ScatterViewItem svi = sender as ScatterViewItem;
            svi.IsTopmostOnActivation = true;
    }

そんなずる賢い方法を思いつくだけで気分が悪いです。しかし、TouchEnter のトンネリングがないため、TouchEnter を取得するすべてのビジュアル ツリー オブジェクトをチェックする必要があり、さらに悪いことになります。さらに、とにかく保護されたメソッド TouchDevice.Deactivate() の使用方法がわかりませんでした。しかし、SVI はとにかく touchDevice をキャプチャし、再スタックされるため、TopmostOnActivation プロパティを使用してそれらを保持する唯一の方法を見つけてから、ウィンドウで PreviewTouchDown をキャッチし、指以外のものを捨てます。

タッチ階層に入るにはもっと良い方法があるはずですよね?

于 2012-02-29T16:23:13.450 に答える
0

わかりましたので、タッチ階層をさらに深く掘り下げました。まず、すべての TouchDown が発生する前に TouchEnter が発生しますが、そのためのトンネリング イベントはありません。すべてのイベントが完了した後に TouchFrameHandler が発生するため、それを破棄します。

次に、UIElements でキャプチャを解放しても、Touch が既にキャプチャされているため、私の問題に実際には違いがないことに気付きました。したがって、すべての要素で TouchEnter の TouchDevice を削除する必要があります。TouchDevice には Deactivate メソッドがありますが、保護されています。TouchDevice を非アクティブ化する方法を理解できれば、それでうまくいくはずです。それは合理的に聞こえますか?もしそうなら、保護されたメソッドをオーバーライドする方法を理解する必要があります。

于 2012-02-24T17:08:30.993 に答える