Колесо мышиного пузыряется в волнообразных формах? - PullRequest
3 голосов
/ 08 августа 2011

У меня небольшая проблема с событиями winforms и mousewheel.У меня есть пользовательский элемент управления, представляющий слайдер.Теперь у меня есть пара групп ползунков, в которых каждая группа находится внутри панели.Все группы затем переносятся в другую панель (для которой для AutoScroll установлено значение true), и это переносится в форму.Логика ползунка реализована так, что колесо мыши может использоваться для изменения его значения.Для этого пользовательский элемент управления слайдера получает фокус, когда мышь находится над слайдером.Однако при прокрутке родительская панель AutoScroll прокручивается вместе с ней.Я уже потерял много времени на эту проблему.Кто-нибудь знает, что здесь происходит и как я могу это решить?Я думал, что событие переместилось на родительскую панель, но я не нахожу свойство Handled для события при обработке его в элементе управления Slider (как это возможно в WPF).

большое спасибо

Ответы [ 2 ]

14 голосов
/ 08 августа 2011

Мы реализовали Slider как законченный пользовательский элемент управления (наследующий класс UserControl) с собственным внешним видом.

Возможно, вы заметили, что UserControl не показывает событие MouseWheel в окне свойств. Намек на неприятности там. Сообщение WM_MOUSEWHEEL пузырится. Если элемент управления, имеющий фокус, не обрабатывает его, Windows передает его родительскому элементу. Неоднократно, пока не найдет родительское окно, которое хочет с ним справиться. Панель в вашем случае.

Вам нужно будет вызвать немного черной магии в вашем управлении ползунком. Фактический объект args события, который передается событию MouseWheel, не относится к типу MouseEventArgs, как предполагает подпись события, это HandledMouseEventArgs. Что позволяет вам прекратить пузыриться. Как это:

    protected override void OnMouseWheel(MouseEventArgs e) {
        base.OnMouseWheel(e);
        // do the slider scrolling
        //..
        ((HandledMouseEventArgs)e).Handled = true;
    }
0 голосов
/ 08 августа 2011

Если вы создаете событие динамически, например

object.event += new EventHandler<EventArgs>(eventfunction);

, попробуйте отменить регистрацию события после того, как функция события будет вызываться следующим образом

object.event -= new EventHandler<EventArgs>(eventfunction);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...