Pregunta

Tengo un panel en mi formulario con AutoScroll configurado en true para que aparezca automáticamente una barra de desplazamiento.

¿Cómo puedo hacer que un usuario pueda usar la rueda del mouse para desplazar el panel? Gracias SO.

¿Fue útil?

Solución

El panel o un control en el panel debe tener foco. Tenga en cuenta que si el control con foco tiene barras de desplazamiento, se desplazará en lugar del panel.

Otros consejos

Lo que funcionó para mí fue agregar panel1 MouseEnter Controlador de eventos:

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

El siguiente código funciona para mí .....

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

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

En el archivo del diseñador, puede agregar la siguiente línea de código. el evento MouseWheel no está duplicado en la lista de Eventos en la ventana Propiedades.

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

Panel1_MouseWheel se activará cuando desplace el dedo del mouse

Agregue el código en el archivo .cs

Asegúrese de que su panel tenga el foco. Y este es un código simple para desplazar la barra de desplazamiento de su panel. Espero que esto ayude. :)     ingrese el código aquí

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

Estoy usando un formulario de Windows con BorderStyle establecido en none, donde uso un panel para tener todos mis controles, por lo que se ve bien (diferencia de color y tal ...) estaba teniendo el mismo problema mientras tenía otros formularios que funcionó bien.

¿Qué olvidé?

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

DoubleBuffered es mágico, noté ...

Mover la rueda de desplazamiento debería activar el evento MouseMove del control. El argumento MouseEventArgs tiene una propiedad llamada Delta, que proporciona el número (con signo) de muescas que la rueda del mouse ha movido. Puede usar esta propiedad para desplazar el panel.

La solución (vista arriba) proporcionada por Beam022 funcionó para mí, mientras que muchas de las otras soluciones no lo hicieron. En mi caso, estaba intentando desplazar un control DataGridView con el evento mousewheel.

Se estaba llamando al controlador de eventos DataGridView_MouseWheel pero el valor FirstDisplayedScrollingRowIndex nunca cambió. El valor siempre fue '0' incluso después de establecerlo explícitamente en 1. Es como si la propiedad fuera de solo lectura.

Todavía reproducciones en .Net Framework 4.6.

En mi caso, toda el área del cliente del panel estaba ocupada por UserControls (ni un solo píxel del área interna visible, excepto las barras de desplazamiento).

En este caso, el panel no obtiene los eventos del mouse y nunca se enfocará (aparentemente, hacer clic en la barra de desplazamiento no cuenta como "estar dentro del panel").

Tuve que agregar las siguientes líneas al constructor de mi clase derivada de UserControl:

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

Ahora funciona bien, ya que no tengo contenido desplazable en los UserControls.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top