Как прокрутить панель с помощью колесика мыши? - PullRequest
37 голосов
/ 21 октября 2009

В моей форме есть панель с AutoScroll, установленной в true, поэтому автоматически появляется полоса прокрутки.

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

Ответы [ 9 ]

55 голосов
/ 01 февраля 2012

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

private void panel1_MouseEnter(object sender, EventArgs e)
{
    panel1.Focus();
}
28 голосов
/ 21 октября 2009

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

15 голосов
/ 22 января 2011

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

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

 private void Panel1_MouseWheel(object sender, MouseEventArgs e)
        {
         panel1.Focus();
         }
2 голосов
/ 25 июня 2013

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

        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;
        }
2 голосов
/ 08 декабря 2009

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

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

Panel1_MouseWheel будет срабатывать при наведении мыши на weel

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

1 голос
/ 24 декабря 2014

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

Что я забыл:

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

DoubleBuffered это волшебство, которое я заметил ..

0 голосов
/ 23 января 2018

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

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

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

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

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

0 голосов
/ 06 августа 2015

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

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

Все еще воспроизводится в .Net Framework 4.6.

0 голосов
/ 21 октября 2009

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

...