Событие мыши GetItemAt (e.X, e.Y) дает неправильные значения для элемента управления ListView - PullRequest
0 голосов
/ 20 января 2012

Странное поведение с C # (VS 2010) Событие щелчка мыши ListView Control (элементы без флажка):

private void m_ListView_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        // Returning some times wrong values
        ListViewItem lvi = m_ListView.GetItemAt(e.X, e.Y); 

        //.... more logic here
    }
}

После того, как я щелкнул элемент и сразу же переместил мышь вниз или вверх, некоторые другиеэлемент выбирается вместо того, для которого он предназначен;

Я отлаживал и узнал, что eX, eY захватывает НЕПРАВИЛЬНЫЕ значения.Когда я нажимаю и оставляю указатель мыши неподвижным, он работает нормально.Но если я щелкнул и сразу переместился в другую строку, вместо этого выделяется одна из этой строки.

Вопросы:

  • Это известная проблема с событиями мыши ListView?
  • Есть ли другой способ получить правильные координаты для событий мыши?

Это проект уровня предприятия, где производительность очень важна.Мы написали оригинальный код для всех событий мыши, таких как: вверх, вниз, двойной щелчок, щелчок мышью, проверка элементов и т. Д.

-Kartik

Ответы [ 3 ]

2 голосов
/ 20 января 2012
ListViewItem lvi = m_ListView.FocusedItem;

Это должно сработать, чтобы получить предмет, на который только что щелкнули (Фокус)

m_ListView.GetItemAt(e.X, e.Y);

Получит элемент в месте расположения мыши, поэтому он меняется, когда вы быстро убираете мышь, если вы хотите, чтобы элемент, который вы только что щелкнули, m_ListView.FocusedItem должен работать нормально

1 голос
/ 20 января 2012

Это предусмотрено, что событие MouseClick генерируется событием MouseUp . Все события щелчка работают так. Нажатие на кнопку, перемещение мыши и отпускание кнопки, таким образом, всегда дает место, где вы отпустили кнопку, а не то, где вы ее нажали.

Вместо этого вам нужно использовать событие MouseDown.

1 голос
/ 20 января 2012

Возможно, вы захотите рассмотреть, что составляет «неправильное значение». Событие click является событием высокого уровня, и момент выполнения кода не обязательно совпадает с положением мыши в это время. Сохраненные координаты этого события клика взяты с момента , когда пользователь нажал кнопку . Если вы продолжите двигать мышь, координаты внутри события будут не равны координатам мыши в тот же момент.

Вы говорите, что обрабатываете все события мыши. Если это для производительности, рассмотрите возможность использования встроенных механизмов управления, они оптимизированы для скорости и точности. Трудно улучшить 10-летнюю разработку (контроль, осуществляемый различными ранними инкарнациями, видел довольно много времени в MS).

Если вам действительно нужна максимальная скорость, напишите свой собственный элемент управления с нуля. Используйте низкоуровневые события мыши для получения наилучшей доступной информации.

...