web-dev-qa-db-fra.com

C # - Comment puis-je empêcher le défilement de la souris dans ma liste déroulante?

J'ai une liste déroulante et je veux empêcher l'utilisateur de faire défiler les éléments avec la molette.

Y a-t-il un moyen facile de faire ça?

(C #, VS2008)

54
Pygmy

Utilisez l’événement MouseWheel pour votre ComboBox:

void comboBox1_MouseWheel(object sender, MouseEventArgs e) {
    ((HandledMouseEventArgs)e).Handled = true;
}

Remarque: vous devrez créer un événement dans le code:

comboBox1.MouseWheel += new MouseEventHandler(comboBox1_MouseWheel);
101
Jay Riggs

Pour WPF, gérez plutôt l'événement PreviewMouseWheel.

Il serait également judicieux de considérer ComboBox.IsDropDownOpen pour que l'utilisateur puisse toujours utiliser le défilement de la souris s'il y a beaucoup d'éléments dans la sélection lorsque la ComboBox est développée.

Une autre chose est d'appliquer le même comportement à travers toute l'application.

Je fais habituellement tout ce qui précède en utilisant le code suivant:

App.xaml

<Application.Resources>
    <Style TargetType="ComboBox">
        <EventSetter Event="PreviewMouseWheel" Handler="ComboBox_PreviewMouseWheel" />
    </Style>
</Application.Resources>

App.xaml.cs

private void ComboBox_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
    e.Handled = !((System.Windows.Controls.ComboBox)sender).IsDropDownOpen;
}
1
Paolo Go

J'utilise une autre solution qui fonctionne également sur Mono.

L’objectif est d’empêcher le défilement accidentel (c’est-à-dire lorsque l’utilisateur ne regarde pas la liste déroulante lorsqu’il utilise la molette de la souris). S'il fait défiler en dehors de la partie visible de la comboBox, la liste déroulante ne doit pas défiler, sinon elle le devrait.

Ma solution:

  • Placez une zone de texte en lecture seule à l'extérieur de la partie visible de l'écran. Dans form_load, j'ai placé la ligne: hiddenTextbox.left = -100;

  • Définissez le focus sur cette zone de texte lorsque la souris quitte la zone de liste déroulante à l'aide de l'événement quitter la souris. Dans comboBox1_MouseLeave, j'ai placé la ligne: hiddenTextbox.focus ();

  • Gérer l'événement mouseWheel: From1.MouseWheel + = Form1_MouseWheel; textBoxHidden.MouseWheel + = Form1_MouseWheel;

0
Eduard