2009-10-21 16 views

Respuesta

27

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

+1

Hola John, ¿así que acabo de ajustar el foco() al controlador del panel y debería desplazarse? –

+0

Exactamente. Puede llamar a panel1.Focus() o simplemente hacer clic en algo en el panel y se desplazará. –

+1

Acabo de probar esto y no funciona. La rueda del mouse no tiene efecto en las barras de desplazamiento del panel. Tal vez estoy haciendo algo mal. – MusiGenesis

0

Al mover la rueda de desplazamiento se debe activar el evento MouseMove del control. El argumento MouseEventArgs tiene una propiedad denominada Delta, que proporciona el número (firmado) de muescas que la rueda del mouse ha movido. Puede usar esta propiedad para desplazarse por el panel.

+0

Solo para la posteridad: esto sí activa el evento MouseMove, pero la propiedad Delta (aunque su IntelliSense está de acuerdo con su declaración anterior) siempre es 0, por lo que puedo decir. Más aquí - http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/98029bb7-7a0b-432d-95eb-4a3160df5ab0 –

2

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

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

Panel1_MouseWheel se activará cuando se despliegue el weel ratón

Agregue el código en el archivo .cs los

+3

Para la posteridad: el evento MouseWheel no se activará a menos que un control en el panel tenga foco, como se indica en la respuesta aceptada. En ese punto, el panel se desplazará automáticamente, pero este evento será viable para una mayor personalización. –

14

A continuación código funciona para mí .....

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

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

Esto es excelente. Más sucintamente, en el constructor de la forma parental: 'MouseWheel + = (s, e) => myPanel.Focus();' –

52

Lo que funcionó para mí fue agregar panel1_MouseEnter EventHandler:

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

gracias, esta solución más simple funcionó para mí. tiene un cuadro de imagen que se llena dentro del panel. En lugar de ingresar el mouse panel, hice cuadro de entrada mouse mouse que resolvió mi problema. – Esen

+6

Esto puede crear un comportamiento muy inesperado, si hace clic en un cuadro de texto o si desea editar algo más, esto enfocará el panel si coloca el mouse sobre él. Yo no haría esto ... (solo mi opinión) – Console

+0

Esto no funcionó para mí, ya que el panel estaba completamente ocupado por controles que no pasaban el evento al padre, por lo que el panel nunca obtuvo el evento de ingresar el mouse en el primer lugar. –

2

Asegúrese de que su panel esté enfocado. Y este es un código simple para desplazar la barra de desplazamiento de su panel. Espero que esto ayude. :) Introducir 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; 
     } 
1

estoy usando una ventana de formar con EstiloDeLosBordes establece en ninguno, en el que utilizar un panel de tener a todos mis controles, por lo que se ve bien (diferencia de color y tal ..) era teniendo el mismo problema mientras tenía otras formas que funcionaban bien.

Lo que hizo me olvidaba:

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

DoubleBuffered es mágico me di ..

0

El solution (visto anteriormente) proporcionada por Beam022 trabajó 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 repro en .Net Framework 4.6.

+0

Me di cuenta de que ni siquiera necesito usar un código especial para desplazar las cuadrículas con la rueda del mouse, así que pude eliminar un montón de código innecesario, incluido el problemático FirstDisplayedScrollingRowIndex. El acto de establecer el foco en el control DataGridView es suficiente. – GrayDwarf

+0

Esto no es una respuesta – adao7000

0

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 recibe los eventos del mouse y nunca se enfocará (al parecer, al hacer clic en la barra de desplazamiento no se cuenta como "estar dentro del panel").

he tenido que añadir las siguientes líneas al constructor de mi clase derivada control de usuario:

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

Ahora funciona bien, ya que no tienen contenido desplazable en las UserControls.

Cuestiones relacionadas