Как прокрутить панель с помощью колесика мыши?

StackOverflow https://stackoverflow.com/questions/1600664

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

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

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

        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;
        }

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

Что я забыл?

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top