Question

J'ai un panneau sur mon formulaire avec AutoScroll défini sur true pour qu'une barre de défilement apparaisse automatiquement.

Comment puis-je faire en sorte qu'un utilisateur puisse utiliser la molette de sa souris pour faire défiler le panneau? Merci beaucoup.

Était-ce utile?

La solution

Le panneau ou une commande du panneau doit avoir le focus. Notez que si le contrôle avec le focus a des barres de défilement, il défilera à la place du panneau.

Autres conseils

Ce qui a fonctionné pour moi a été d'ajouter panel1_MouseEnter gestionnaire d'événements:

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

Le code ci-dessous fonctionne pour moi .....

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

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

Dans le fichier du concepteur, vous pouvez ajouter la ligne de code suivante. l'événement MouseWheel n'est pas ajouté à la liste des événements de la fenêtre Propriétés.

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

Panel1_MouseWheel sera déclenché lorsque vous faites rouler la souris

Ajoutez le code dans le fichier .cs

Assurez-vous que votre panneau est activé. Et ceci est un code simple pour faire défiler votre barre de défilement du panneau. J'espère que cette aide. :)     entrez le code ici

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

J'utilise un formulaire Windows avec BorderStyle défini sur aucun, où j'utilise un panneau pour insérer toutes mes commandes, de sorte qu'il a l'air sympa (différence de couleur et autres ..) présentait le même problème, alors que d'autres formulaires a bien fonctionné.

Qu'est-ce que j'ai oublié:

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

DoubleBuffered est magique, j'ai remarqué ..

Le déplacement de la molette de défilement doit déclencher l'événement MouseMove du contrôle. L'argument MouseEventArgs a une propriété appelée Delta, qui donne le nombre (signé) d'encoches que la molette de la souris a déplacés. Vous pouvez utiliser cette propriété pour faire défiler le panneau.

La solution (voir ci-dessus) fournie par Beam022 a fonctionné pour moi, contrairement à de nombreuses autres solutions. Dans mon cas, j'essayais de faire défiler un contrôle DataGridView avec l'événement mousewheel.

Le gestionnaire d'événements DataGridView_MouseWheel était appelé mais la valeur FirstDisplayedScrollingRowIndex n'a jamais été modifiée. La valeur était toujours '0' même après l'avoir explicitement définie sur 1. C'est comme si la propriété était en lecture seule.

Encore une reproduction dans .Net Framework 4.6.

Dans mon cas, toute la zone cliente du panneau était occupée par UserControls (pas un seul pixel de la zone interne visible, à l'exception des barres de défilement).

Dans ce cas, le panneau n'obtient pas les événements de la souris et ne se focalisera jamais (apparemment, cliquer sur la barre de défilement ne compte pas comme "étant à l'intérieur du panneau").

J'ai dû ajouter les lignes suivantes au constructeur de ma classe dérivée UserControl:

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

Maintenant, cela fonctionne bien, car je n'ai pas de contenu déroulant dans les contrôles utilisateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top