Предварительный просмотр колесика мыши на панели автопрокрутки

Давайте иметь большой Control (чье Size задано извне и «не может» быть изменено). Этот Control содержится в Panel. Есть очень полезная функция Panel.Autoscroll = true, позволяющая удобно прокручивать большие Control без труда.

Есть одна проблема: Control должен обрабатывать MouseWheel (и он получает события, как и ожидалось - он ориентирован на ввод мыши). К счастью, Panel также фиксирует те же события колесика мыши и использует их для прокрутки. Это нежелательно для случаев, когда Control "потребляет" события.

Я не могу найти стандартный способ справиться с этим. Даже событие Panel.Scroll вызывается только при прокрутке щелчка мыши, а не при прокрутке колесика мыши.

Есть ли естественный дружественный к WinForms способ временно указать Panel с AutoScroll, установленным в true, чтобы не обрабатывать события колесика мыши для прокрутки?


person sharpener    schedule 14.10.2014    source источник
comment
Проблема в том, что элемент управления не использует событие. Он использует событие, но затем позволяет всплывать его родительскому элементу. Справочная информация здесь.   -  person Hans Passant    schedule 14.10.2014
comment
Да, я знал, что это не так, но поскольку в MouseEventArgs нет флага, сигнализирующего об этом, возник вопрос. Как (черт возьми;) вы знаете, что это на самом деле HandledMouseEventArgs (и, следовательно, он содержит потребляемый флаг)? Достаточно просто отлить его (безопасно) и установить Handled на случай потребления. Спасибо!   -  person sharpener    schedule 14.10.2014
comment
referencesource.microsoft .com/#System.Windows.Forms/ndp/fx/src/   -  person Hans Passant    schedule 14.10.2014
comment
Не знал об этом. Даже лучше, чем ILSpy.   -  person sharpener    schedule 14.10.2014


Ответы (1)


Замените свою панель с AutoScroll = True на эту версию, которая закомментирует базовый вызов метода OnMouseWheel:

public class PanelEx: Panel {
  protected override void OnMouseWheel(MouseEventArgs e) {
    //base.OnMouseWheel(e);
  }
}

или, как указывает Ханс из своего связанного ответа, установите для свойства Handled значение true в вашем элементе управления:

protected override void OnMouseWheel(MouseEventArgs e) {
  base.OnMouseWheel(e);
  ((HandledMouseEventArgs)e).Handled = true;
}
person LarsTech    schedule 14.10.2014
comment
Не останавливает всплытие, теперь форма прокручивается :) Правильное исправление ((HandledMouseEventArgs)e).Handled = true; - person Hans Passant; 14.10.2014
comment
Нет необходимости создавать новую панель. Достаточно привести его в реализации по умолчанию внутри обработчика событий колесика мыши. - person sharpener; 14.10.2014