Wpf: почему CaptureMouse () в OnMouseDown (...) вызывает событие OnMouseMove (...)? - PullRequest
0 голосов
/ 03 апреля 2020

Почему CaptureMouse() in OnMouseDown(...) вызывает 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(), что вызывает событие ввода.

1 Ответ

0 голосов
/ 03 апреля 2020

Если вы воссоздали вашу ситуацию с помощью обычного главного окна WPF.
Затем я сделал то же самое, что и вы, переопределив OnMouseDown и OnMouseMove и добавил CaptureMouse() к методу OnMouseDown.
Затем я записывал в консоль каждый раз, когда каждый метод вызывался вместе со значением миллисекунды текущей даты и времени.
Я получил следующие результаты:

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

Вы можете видеть, что Я просто переместил свою мышь, затем щелкнул несколько раз и затем переместил мою мышь снова. Это не вызывает OnMouseMove для вызова при вызове OnMouseDown.

Вы пытались воссоздать вашу ситуацию в новом чистом WPF?

РЕДАКТИРОВАТЬ:

После обновления кода я столкнулся с той же проблемой. У меня нет решения / причины на данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...