Wpf:为什么OnMouseDown(..)中的CaptureMouse()引发OnMouseMove(..)事件



为什么OnMouseDown(...)中的CaptureMouse()引发OnMouseMove(...)事件?

public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}

protected override void OnMouseDown(MouseButtonEventArgs e) {
Trace.WriteLine( "OnMouseDown: Begin" );
CaptureMouse();
Trace.WriteLine( "OnMouseDown: End" );
}
protected override void OnMouseMove(MouseEventArgs e) {
if (IsMouseCaptured) Trace.WriteLine( "OnMouseMove" );
}
protected override void OnMouseUp(MouseButtonEventArgs e) {
Trace.WriteLine( "OnMouseUp" );
ReleaseMouseCapture();
}
}

输出:

OnMouseDown: Begin
OnMouseMove // Wtf???
OnMouseDown: End
OnMouseMove
OnMouseMove
OnMouseMove
OnMouseUp

更新

MouseDevice.Capture()调用引发输入事件的MouseDevice.Synchronize()

If只使用一个常规的WPF主窗口重新创建了您的情况
然后我像您一样重写OnMouseDownOnMouseMove,并将CaptureMouse()添加到OnMouseDown方法中
然后,每次调用每个方法时,我都会向控制台写入当前日期时间的毫秒值
我得到了以下结果:

OnMouseMove |247 OnMouseMove |386 OnMouseMove |656 OnMouseDown |814 OnMouseDown |702 OnMouseDown |798 OnMouseDown |587 OnMouseDown |88 OnMouseMove |96 OnMouseMove |98 OnMouseMove |102

你可以看到,我只是移动了鼠标,然后点击了几次,然后又移动了鼠标。这不会导致在调用OnMouseDown时调用OnMouseMove

你有没有试图在一个新的干净的WPF中重现你的处境?

编辑:

更新代码后,我遇到了同样的问题。我现在没有解决办法/理由。

最新更新