Windows 8 检测滚动已完成,指针已更改
我在WinRT中使用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; 现在有模拟鼠标滚动的设备(触摸板或触摸鼠标等)。 他们倾向于在每个“滚动”中发出数十个或数百个(
指针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已经做了节流的事情,但它并不完美。一般来说,这是一种黑客行为,但是我们还可以使用什么其他技术呢?翻转轮子是一个计算机生成的事件,其来源是动态的,因为您的操作是昂贵的