Windows 8 检测滚动已完成,指针已更改

Windows 8 检测滚动已完成,指针已更改,windows-8,windows-runtime,mouse,mousewheel,Windows 8,Windows Runtime,Mouse,Mousewheel,我在WinRT中使用指针heelchanged事件检测鼠标滚轮滚动。我使用PointerPoint.Properties.MouseWheelDelta来检测滚动的数量和方向: PointerPoint mousePosition = e.GetCurrentPoint(_control); var delta = mousePosition.Properties.MouseWheelDelta; 现在有模拟鼠标滚动的设备(触摸板或触摸鼠标等)。 他们倾向于在每个“滚动”中发出数十个或数百个(

我在WinRT中使用
指针heelchanged
事件检测鼠标滚轮滚动。我使用
PointerPoint.Properties.MouseWheelDelta
来检测滚动的数量和方向:

PointerPoint mousePosition = e.GetCurrentPoint(_control);
var delta = mousePosition.Properties.MouseWheelDelta;
现在有模拟鼠标滚动的设备(触摸板或触摸鼠标等)。 他们倾向于在每个“滚动”中发出数十个或数百个(原文如此!)
pointerheelchanged
events。传统鼠标滚轮在每次滚轮点击时会发出一个事件,其增量为+-120个单位

我需要做一些沉重的处理,一旦用户滚动到某个位置

有没有办法理解“新”卷轴已经完成

仅供参考,这里是一个鼠标滚轮增量,用于使用Microsoft TouchMouse进行单手指轻弹(很抱歉,我只是想说明这个问题)

十五 15 164 164 304 304 658 658 773 773 887 887 1000 1000 1111 1111 1221 1221 1330 1330 108 108 107 107 106 106 105 105 104 104 103 103 102 102 203 203 100 100 99 99 98 98 97 97 96 96 95 95 94 94 93 93 92 92 91 91 90 90 89 89 88 88 88 88 87 87 86 86 85 85 84 84 83 83 82 82 82 82 81 81 80 80 79 79 78 78 78 78 77 77 76 76 75 75 75 75 74 74 73 73 72 72 72 72 71 71 70 70 70 70 69 69 68 68 67 67 67 67 66 66 65 65 65 65 64 64 63 63 63 63 62 62 62 62 61 61 60 60 60 60 59 59 59 59 58 58 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 41 41 41 41 40 40 40 40 40 40 39 39 39 39 38 38 38 38 38 38 37 37 37 37 37 37 36 36 36 36 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 31 30 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 22 21 21 21 21 21 21 21 21 21 21 20 20 20 20 20 20 20 20 20 20 19 19 19 19 19 19 19 19 19 19 18 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 16 16 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 14 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 12 12 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 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. 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. 7. 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. 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. 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. 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. 3. 3. 3. 3. 3. 3. 3. 3. 3. 9 9 3. 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. 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. 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);
//鼠标增量之间的间隔
私有只读时间跨度_WheelDeltThrottleInterval=TimeSpan.From毫秒(8);
//等待滚动完成的时间间隔
专用只读时间跨度_wheelDeltaCompleteInterval=TimeSpan.From毫秒(600);
//创建智能车轮处理程序
IObservable指针HeeLobservable=
系统反应性Linq可观察
.FromEventPattern(
handler=>\u control.pointerheelchanged+=handler,
handler=>\u control.pointerheelchanged-=handler)
.选择(eventPattern=>
{
PointErrorutedEventArgs e=eventPattern.EventArgs;
PointerPoint鼠标位置=e.GetCurrentPoint(_控件);
返回鼠标位置;
})
.Where(mousePosition=>Math.Abs(mousePosition.Properties.MouseWheelDelta)>MouseWheelDeltaThreshold);
//订阅控制盘更改
指针HeeLobServable
.节气门(_wheelDeltaThrottleInterval)
.ObserveOnDispatcher()
.订阅(
在改变了的指针上,
TrackException);
指针HeeLobServable
.节气门(\u车轮完成间隔)
.订阅(
在完成的指针上,
TrackException);

EDIT2
GestureRecognitor
类没有帮助

请参阅这篇关于Windws8操作处理的博文。


不幸的是,在我的实验之后,我发现
手势识别器
无法检测鼠标滚轮事件。每次调用.ProcessMouseWheelEvent()后,它都会触发操纵完成事件。您可以使用反应式扩展库和WheelChangedEvent,这样您将始终获得指定节流时间段的最后一次通知。

使用手势识别器更好地检测操纵(包括鼠标旋转)。 所有输入(鼠标、触摸、笔等)都包含在这里,并且比传统操作事件更好地支持。(它们不支持单触旋转、鼠标滚动等)


这比从头开始实现所有功能更高效、更灵活、更安全。

您使用它的目的是什么?你说当用户滚动到某个位置、列表中或其他位置时,你想做一些处理?如果是这样的话,我认为在列表上检测滚动位置会更容易,而不是鼠标/键盘…用户正在放大或缩小我们自己的地图实现A已经做了节流的事情,但它并不完美。一般来说,这是一种黑客行为,但是我们还可以使用什么其他技术呢?翻转轮子是一个计算机生成的事件,其来源是动态的,因为您的操作是昂贵的