Domanda

Ho un pannello nel mio modulo con AutoScroll impostato su true, quindi una barra di scorrimento viene visualizzata automaticamente.

Come posso farlo in modo che un utente possa usare la rotellina del mouse per scorrere il pannello? Grazie SO.

È stato utile?

Soluzione

Il pannello o un controllo nel pannello deve essere attivo. Nota che se il controllo con focus ha barre di scorrimento, scorrerà invece del pannello.

Altri suggerimenti

Ciò che ha funzionato per me è stato l'aggiunta di panel1_MouseEnter EventHandler:

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

Il codice qui sotto funziona per me .....

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

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

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

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

Panel1_MouseWheel verrà attivato quando si sposta il cursore del mouse

Aggiungi il codice nel file .cs

Assicurati che il tuo pannello sia attivo. E questo è un semplice codice per scorrere la barra di scorrimento del pannello. Spero che questo aiuto. :)     inserisci 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;
        }

Sto usando un form di Windows con BorderStyle impostato su none, dove uso un pannello per avere tutti i miei controlli, quindi sembra carino (la differenza di colore e simili ..) stava avendo lo stesso problema mentre avevo altri moduli che ha funzionato bene.

Cosa ho dimenticato:

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

DoubleBuffered è magico che ho notato ..

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 (con segno) di tacche che la rotellina del mouse ha spostato. Puoi usare questa proprietà per scorrere il pannello.

La soluzione (vista sopra) fornita da Beam022 ha funzionato per me, mentre molte delle altre soluzioni no. Nel mio caso, stavo tentando di scorrere un controllo DataGridView con l'evento mousewheel.

Il gestore eventi DataGridView_MouseWheel veniva chiamato 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.

La riproduzione è ancora in .Net Framework 4.6.

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

In questo caso il pannello non riceve gli eventi del mouse e non si focalizzerà mai (apparentemente, fare clic sulla barra di scorrimento non conta come "essere all'interno del pannello").

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

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

Ora funziona bene, poiché non ho contenuti scorrevoli in UserControls.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top