Проблема с событием MouseMove, запускаемым при перемещении содержимого элемента управления с помощью клавиш со стрелками - PullRequest
0 голосов
/ 02 июня 2011

My UserControl - это вид контейнера, внутри которого есть набор элементов управления.Одно из разработанных мной поведений пользовательского интерфейса заключается в том, что перемещение по вложенному элементу управления делает его выбранным для некоторых действий, запускаемых с клавиатуры.

Другой способ настройки вложенного элемента управления, который предназначен для приема ввода с клавиатуры, - клавиши со стрелками, которые изменяют фокус на определенный элемент управления в моем UserControl.

Проблема в том, что в большинстве случаев у моего UserControl есть полосы прокрутки, а переключение между его элементами с помощью клавиш со стрелками вызывает перемещение содержимого.Из-за этого движения кажется, что событие mousemove запускается и тогда, когда стрелка мыши стоит на месте, но она находится над моим контролем пользователя.В конце выбирается неправильный вложенный элемент управления.

Я попытался установить логический флаг для временной блокировки действий события mousemove, когда запущена функция обработки клавиш со стрелками, но, похоже, она не работает вообще.

Кто-нибудь знает, как предотвратить нежелательный запуск события mousemove и избежать проблем, которые он вызывает?

1 Ответ

0 голосов
/ 04 июня 2011

Я провел некоторые отладки / эксперименты, и кажется, что, хотя мышь остается все еще над управлением, MouseMove на самом деле часто вызывается, а не только когда перемещение элемента управления вызвано некоторым поведением пользовательского интерфейса (прокрутка родительского элемента управления вызывается с помощьюклавиатуры).

Также кажется, что он вызывается дважды каждую секунду (но, вероятно, только когда приложение запускается из VS во время сеанса отладки?), Вызовы разделяются на несколько сотен секунд, и на данный момент я не могу определить, чтовызывает их.

Решение (может быть, не только и не лучшее) состоит в том, чтобы сохранить последнюю позицию курсора и сравнить ее внутри события, чтобы проверить, действительно ли мышь была перемещена из последнего MouseMove вызова.Я добился этого, используя System.Windows.Forms.Cursor.Position, потому что позиция из MouseEventArgs будет отличаться в зависимости от обстоятельств, но все же будет неубедительным, чтобы определить, был ли перемещен курсор мыши.

    Point lastCursorPosition = new Point();

    private void panelPictures_MouseMove(object sender, MouseEventArgs e)
    {
        if (System.Windows.Forms.Cursor.Position != lastCursorPosition)
        {
            Console.WriteLine("mouse moved");
            lastCursorPosition = System.Windows.Forms.Cursor.Position;
        }
        else
        {
            Console.WriteLine("mouse in place");
        }
    }
...