2

PointerWheelChangedWinRT でイベントを使用してマウス ホイールのスクロールを検出します。PointerPoint.Properties.MouseWheelDeltaスクロールの量と方向を検出するために使用します。

PointerPoint mousePosition = e.GetCurrentPoint(_control);
var delta = mousePosition.Properties.MouseWheelDelta;

最近では、マウス スクロールをエミュレートするデバイスがあります (タッチパッドやタッチ マウスなど)。PointerWheelChanged「スクロール」ごとに数十または数百 (原文のまま!) のイベントを発行する傾向があります。従来のマウス ホイールは、ホイール クリックごとに 1 つのイベントを発行し、デルタは +-120 単位です。

ユーザーが特定の位置にスクロールするとすぐに、重い処理を行う必要があります。

「新しい」スクロールが完了したことを理解する方法はありますか?

参考までに、Microsoft TouchMouse で 1 本の指でフリックした場合のマウス ホイールのデルタを次に示します (量が多くて申し訳ありません。問題を説明したいだけです)。

15 15 164 164 304 304 658 658 773 773 887 887 1000 1000 1000 1111 1111 1221 1221 1330 1330 1330 1330 1330 108 107 107 107 106 106 105 105 105 104 103 103 102 102 102 203 203 100 100 99 99 99 99 99 99 99 99 98 98 93 93 92 92 91 91 90 90 89 89 88 88 88 88 8887 86 86 85 85 84 84 83 83 82 82 82 82 82 81 81 80 80 79 78 78 78 78 78 77 77 76 76 75 75 75 75 74 74 74 73 73 73 73 73 73 73 73 73 73 72 72 72 72 71 71 71 70 70 70 70 69 69 68 68 68 67 67 67 66 66 65 65 65 65 65 64 63 63 63 63 62 62 62 62 61 61 61 60 60 60 60 60 60 60 60 59 59 59 59 59 58 58 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 56 56 56 56 55 55 55 55 54 54 54 54 53 53 52 52 52 52 51 51 51 51 50 50 50 50 49 49 49 49 48 48 48 48 47 47 47 47 46 46 46 46 46 46 45 45 45 45 44 44 44 44 43 43 43 43 42 42 42 42 42 42 42 41 41 41 41 40 40 40 40 40 40 40 40 39 39 39 39 39 38 38 38 38 38 38 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 35 35 35 35 35 35 35 34 34 34 34 34 34 33 33 33 33 33 33 32 32 32 32 32 32 31 31 31 31 31 3130 30 30 30 30 30 30 30 29 29 29 29 29 29 28 28 28 28 28 28 28 28 27 27 27 27 27 27 26 26 26 26 26 26 26 26 25 25 25 25 25 25 25 25 24 24 24 24 24 24 24 24 23 23 23 23 23 23 23 23 23 23 22 22 22 22 22 22 22 21 21 21 21 21 21 21 21 21 21 21 21 20 20 20 20 20 20 20 20 20 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 18 18 18 18 18 18 18 18 18 18 18 17 17 17 17 17 17 17 17 17 17 17 17 16 16 16 16 16 16 16 16 16 16 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 15 15 22 22 7 7 7 7 14 14 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 6 6 6 66 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 8 8 12 12 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 9 9 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 15 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 8 8 12 12 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 9 9 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 15 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 8 8 12 12 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 9 9 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

編集:今、私はこのハックを行いますが、完璧にはほど遠いです

// interval between mouse deltas
private readonly TimeSpan _wheelDeltaThrottleInterval = TimeSpan.FromMilliseconds(8);

// interval to wait until scroll is complete
private readonly TimeSpan _wheelDeltaCompleteInterval = TimeSpan.FromMilliseconds(600);

// create smart wheel handler
IObservable<PointerPoint> pointerWheelObservable = 
    System.Reactive.Linq.Observable
        .FromEventPattern<PointerEventHandler, PointerRoutedEventArgs>(
            handler => _control.PointerWheelChanged += handler,
            handler => _control.PointerWheelChanged -= handler)
        .Select(eventPattern =>
            {
                PointerRoutedEventArgs e = eventPattern.EventArgs;
                PointerPoint mousePosition = e.GetCurrentPoint(_control);
                return mousePosition;
            })
        .Where(mousePosition => Math.Abs(mousePosition.Properties.MouseWheelDelta) > MouseWheelDeltaThreshold);

// subscribe to wheel changes
pointerWheelObservable
    .Throttle(_wheelDeltaThrottleInterval)
    .ObserveOnDispatcher()
    .Subscribe(
        OnPointerWheelChanged,
        Logger.TrackException);

pointerWheelObservable
    .Throttle(_wheelDeltaCompleteInterval)
    .Subscribe(
        OnPointerWheelCompleted,
        Logger.TrackException);

EDIT2GestureRecognizerクラスが役に立たない

Windows 8 の操作処理に関するこの素晴らしいブログ投稿を参照してください。 http://blogs.msdn.com/b/windowsappdev/archive/2012/07/02/modernizing-input-in-windows-8.aspx

残念ながら、私の実験の後、GestureRecognizerマウスホイールイベントのフラッドが終わったことを検出できないことがわかりました。.ProcessMouseWheelEvent() を呼び出すたびに ManipulationCompleted イベントを発生させます。

4

2 に答える 2

1

GestureRecognizer を使用して、マウスの回転を含む操作の低レベルの検出を改善します。すべての入力 (マウス、タッチ、ペンなど) がここに含まれ、従来の操作イベントよりも適切にサポートされます。(シングル タッチ回転、マウス スクローラーなどはサポートしていません。)

http://code.msdn.microsoft.com/windowsapps/Input-Windows-8-gestures-62c6689b#content

これは、すべてをゼロから実装するよりもはるかに効率的で、柔軟で、安全です。

于 2013-01-05T11:51:40.220 に答える
1

WheelChangedEvent でReactive Extension ライブラリとスロットルを使用すると、指定されたスロットル期間の最後の通知を常に受け​​取ることができます。

于 2012-12-11T09:05:10.440 に答える