2009-10-21 2 views
34

У меня есть панель в моей форме с AutoScroll, установленная в true, поэтому автоматически отображается полоса прокрутки.Как прокрутить панель с помощью мыши?

Как я могу сделать это, чтобы пользователь мог использовать его колесо мыши для прокрутки панели? Спасибо, ТАК.

ответ

27

Панель или элемент управления на панели должны иметь фокус. Обратите внимание, что если элемент управления с фокусом имеет полосы прокрутки, он будет прокручиваться вместо панели.

+1

Привет, Джон, поэтому я просто установил Focus() на контроллер панели, и он должен прокручиваться? –

+0

Точно. Вы можете вызвать panel1.Focus() или просто щелкнуть что-нибудь на панели и прокрутить. –

+1

Я просто попробовал это, и он не работает. Колесо мыши не влияет на полосы прокрутки панели. Может быть, я делаю что-то неправильно. – MusiGenesis

0

Перемещение колеса прокрутки должно запускать событие MouseMove элемента управления. Аргумент MouseEventArgs имеет свойство с именем Delta, которое дает (подписанное) количество выемок, которые перемещало колесо мыши. Вы можете использовать это свойство для прокрутки панели.

+0

Просто для потомков. Это действительно вызывает событие MouseMove, но свойство Delta (хотя его IntelliSense соглашается с вашим заявлением выше) всегда 0, из того, что я могу сказать. Подробнее здесь - http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/98029bb7-7a0b-432d-95eb-4a3160df5ab0 –

2

В файле конструктора вы можете добавить следующую строку кода. событие MouseWheel не выполняется в списке событий в окне «Свойства».

this.Panel1.MouseWheel+= System.Windows.Forms.MouseEventHandler(this.Panel1_MouseWheel); 

Panel1_MouseWheel будет срабатывать, когда вы катите водоворот мыши

Добавьте код в .cs файл

+3

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

14

Ниже код работает для меня .....

Public Form 
{ 
InitializeComponent(); 
this.MouseWheel += new MouseEventHandler(Panel1_MouseWheel); 
} 

private void Panel1_MouseWheel(object sender, MouseEventArgs e) 
     { 
     panel1.Focus(); 
     } 
+2

Это отлично, в конструкторе родительской формы: 'MouseWheel + = (s, e) => myPanel.Focus();' –

52

Что сработало для меня было добавление panel1_MouseEnter EventHandler:

private void panel1_MouseEnter(object sender, EventArgs e) 
{ 
    panel1.Focus(); 
} 
+2

спасибо, это более простое решение сработало для меня. ave поле изображения, которое заполняется внутри панели. Вместо ввода панели мыши. Я сделал картинку, в которой была сделана ошибка. – Esen

+6

Это может создать очень неожиданное поведение, если вы щелкнете текстовым полем или хотите редактировать что-то еще, это сфокусирует панель, если вы в нее входите. Я бы этого не сделал .. (только мое мнение) – Console

+0

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

2

Убедитесь, что ваша панель имеет фокус. И это простой код для прокрутки панели прокрутки панели. Надеюсь, эта помощь. :) введите код здесь

 if(e.Delta > 0) 
     { 

      if (pnlContain.VerticalScroll.Value - 2 >= pnlContain.VerticalScroll.Minimum) 
       pnlContain.VerticalScroll.Value -= 2; 
      else 
       pnlContain.VerticalScroll.Value = pnlContain.VerticalScroll.Minimum; 
     } 
     else 
     { 
      if (pnlContain.VerticalScroll.Value + 2 <= pnlContain.VerticalScroll.Minimum) 
       pnlContain.VerticalScroll.Value += 2; 
      else 
       pnlContain.VerticalScroll.Value = pnlContain.VerticalScroll.Maximum; 
     } 
1

Я использую окна образуют с BorderStyle набор никому, где я использую панель, чтобы все мои управления в, так что это выглядит красиво (разница цвета и такие ..) было имея ту же проблему, в то время как у меня были другие формы, которые отлично работали.

Что я забыл:

public myForm() 
    { 
     InitializeComponent(); 
     this.DoubleBuffered = true; 
    } 

DoubleBuffered волшебно я заметил ..

0

solution (показано выше), предоставленный Beam022 работал для меня в то время как многие из других решений не было. В моем случае я пытался прокрутить элемент управления DataGridView с помощью события mousewheel.

Вызывается обработчик событий DataGridView_MouseWheel, но значение FirstDisplayedScrollingRowIndex никогда не изменялось. Значение всегда было «0», даже после того, как явным образом установил его в 1. Это значит, что свойство было прочитано только.

По-прежнему воспроизводится в .Net Framework 4.6.

+0

Понял, что мне даже не нужно использовать специальный код для прокрутки сеток с помощью колеса мыши, поэтому я смог удалить кучу ненужного кода, включая проблемный FirstDisplayedScrollingRowIndex. Достаточно акта настройки фокуса на элемент управления DataGridView. – GrayDwarf

+0

Это не ответ – adao7000

0

В моем случае вся клиентская область панели была занята UserControls (не видно ни одного пикселя внутренней области, кроме полос прокрутки).

В этом случае панель не принимает события мыши и никогда не будет фокусироваться (при этом щелчок по полосе прокрутки не считается «находящимся внутри панели»).

я должен был добавить следующие строки в конструктор моего UserControl производного класса:

MouseEnter += delegate { 
    Parent?.Focus(); 
}; 

Теперь он отлично работает, так как у меня нет прокручивать содержание в UserControls.