2009-10-21 15 views

risposta

27

Il pannello o un controllo nel pannello deve essere attivo. Notare che se il controllo con il fuoco ha barre di scorrimento, scorrerà al posto del pannello.

+1

Ciao John, quindi ho appena impostato Focus() sul controller del pannello e dovrebbe scorrere? –

+0

Esattamente. Puoi chiamare panel1.Focus() o semplicemente fare clic su qualcosa nel pannello e scorrerà. –

+1

Ho appena provato questo e non funziona. La rotellina del mouse non ha alcun effetto sulle barre di scorrimento del pannello. Forse sto facendo qualcosa di sbagliato. – MusiGenesis

0

Lo spostamento della rotella di scorrimento dovrebbe attivare l'evento MouseMove del controllo. L'argomento MouseEventArgs ha una proprietà denominata Delta, che fornisce il numero (firmato) di tacche spostate dalla rotellina del mouse. È possibile utilizzare questa proprietà per scorrere il pannello.

+0

Solo per i posteri - Questo effettivamente attiva l'evento MouseMove, ma la proprietà Delta IntelliSense è d'accordo con la tua affermazione sopra) è sempre 0, da quello che posso dire. Più qui - http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/98029bb7-7a0b-432d-95eb-4a3160df5ab0 –

2

Nel file di progettazione, è possibile aggiungere la seguente riga di codice. l'evento MouseWheel non è raddoppiato nell'elenco Eventi nella finestra Proprietà.

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

Panel1_MouseWheel verrà attivato quando si tira il weel del mouse

Aggiungere il codice nei cs il file

+3

Per i posteri - l'evento MouseWheel non verrà attivato a meno che un controllo sul pannello non sia attivo, come indicato nella risposta accettata. A quel punto, il pannello scorrerà automaticamente, ma questo evento sarà percorribile per ulteriori personalizzazioni –

14

Sotto codice funziona per me .....

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

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

Questo è Più sinteticamente, nel costruttore della forma genitore: 'MouseWheel + = (s, e) => myPanel.Focus();' –

52

Ciò che ha funzionato per me è stato aggiungere panel1_MouseEnter EventHandler:

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

grazie, questa soluzione più semplice ha funzionato per me. come una scatola di immagini che è riempita all'interno del pannello. Inserisci il mouse del pannello. ho fatto entrare mouse picturebox che ha risolto il mio problema. – Esen

+6

Questo può creare un comportamento molto inaspettato, se si fa clic in un textBox o si desidera modificare qualcos'altro questo focalizzerà il pannello se ci si passa sopra. Non lo farei .. (solo la mia opinione) – Console

+0

Questo non ha funzionato per me, in quanto il pannello era completamente occupato da controlli che non passavano l'evento in alto verso il genitore, quindi il pannello non ha mai avuto il mouse per entrare nell'evento primo posto. –

2

Assicurarsi che il pannello sia a fuoco. E questo è un semplice codice per scorrere la barra di scorrimento del pannello. Spero che questo aiuto. :) Inserire il codice qui

 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

Sto usando un Windows Form con BorderStyle impostata su none, dove ho utilizzare un pannello di avere tutti i miei controlli, così sembra bello (differenza di colore e così via ..) è stato avendo lo stesso problema mentre avevo altre forme che funzionavano bene.

Cosa ho dimenticato:

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

DoubleBuffered è magica che ho notato ..

0

Il solution (visto sopra) fornito da Beam022 ha lavorato per me, mentre molte delle altre soluzioni no. Nel mio caso, stavo tentando di scorrere un controllo DataGridView con l'evento della rotellina del mouse.

È stato chiamato il gestore eventi DataGridView_MouseWheel ma il valore FirstDisplayedScrollingRowIndex non è mai stato modificato. Il valore era sempre '0' anche dopo averlo impostato esplicitamente su 1. È come se la proprietà fosse di sola lettura.

Ancora in versione .Net Framework 4.6.

+0

Realizzato che non ho nemmeno bisogno di usare un codice speciale per scorrere le griglie con la rotellina del mouse, così sono stato in grado di rimuovere un mucchio di codice non necessario compreso il problema FirstDisplayedScrollingRowIndex. L'atto di impostare l'attenzione sul controllo DataGridView è sufficiente. – GrayDwarf

+0

Questa non è una risposta – adao7000

0

Nel mio caso, l'intera area client del pannello era occupata da UserControls (non un singolo pixel dell'area interna visibile, ad eccezione delle barre di scorrimento).

In questo caso il pannello non ottiene gli eventi del mouse e non si focalizzerà mai (in modo appropriato, facendo clic sulla barra di scorrimento non viene considerato "essere all'interno del pannello").

ho dovuto aggiungere le seguenti righe al costruttore della mia UserControl classe derivata:

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

Ora funziona benissimo, come non ho contenuto scorrevole nei controlli utente.

Problemi correlati