désactiver la molette de la souris sur itemscontrol dans wpf
J'ai un usercontrol qui a un scrollviewer, puis un groupe de contrôles enfants comme des zones de texte, boutons radio, et zones de liste, etc à l'intérieur. Je peux utiliser la molette de la souris pour faire défiler le parent scrollviewer jusqu'à ce que ma souris terres à l'intérieur d'une zone de liste puis, la molette de la souris événements commencent à se rendre dans la zone de liste. est-il possible d'avoir la liste envoyer ces événements retour à la mère de contrôle? retrait de la zone de liste depuis le contrôle parent comme cette question suggère (Molette de la souris ne fonctionne pas lorsque plus de ScrollViewer de contrôles enfants) n'est pas une solution.
J'ai essayé
void ListBox_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
e.Handled = true;
}
mais qui n'a pas fonctionné non plus.
Grâce
Vous devez vous connecter pour publier un commentaire.
La réponse que vous avez référencé est exactement ce qui est à l'origine de votre problème, la zone de liste (qui est composé, entre autres choses, un ScrollViewer) à l'intérieur de votre ScrollViewer captures de la roulette de la souris de l'événement et les poignées d'elle, l'empêchant de propagation et donc le ScrollViewer n'a aucune idée de l'événement jamais eu lieu.
Utilisation suivantes extrêmement simple ControlTemplate pour votre ListBox à démontrer (à noter qu'il ne dispose pas d'un ScrollViewer dans et jusqu'à la roulette de la souris de l'événement ne sera pas pris) Le ScrollViewer va encore faire défiler avec la souris sur la zone de liste.
Vous avez l'option de capture de la souris quand il entre dans le ScrollViewer bien que si elle continue à recevoir tous les événements de la souris jusqu'à ce que la souris est relâché, toutefois, cette option serait vous obliger à delgate tout autres événements de la souris pour les contrôles contenus dans le ScrollViewer si vous voulez une réponse...la suite MouseEnter MouseLeave gestionnaires d'événements sera suffisant.
Ni des solutions de contournement que j'ai fournis sont vraiment préféré, cependant, et je suggère de repenser ce que vous êtes en train d'essayer de faire. Si vous expliquez ce que vous essayez d'atteindre dans votre question, je suis sûr que vous allez obtenir quelques suggestions...
Ceci peut être accompli via comportements attachés.
http://josheinstein.com/blog/index.php/2010/08/wpf-nested-scrollviewer-listbox-scrolling/
Edit:
Ici est le lien de la solution:
Où le je de l'espace de noms est à partir de Mélange:
J'ai suivi Amanduh de l'approche pour résoudre le même problème que j'ai eu avec plusieurs composants datagrid dans un scrollviewer, mais en WPF:
DataGrid
type avecUIElement
. Je voudrais aussi suggérer de le nommerPassthroughMouseWheel
puisque c'est ce qu'il fait. En particulier, il ne consomme pas (enfin ignorer) la roue de l'événement. – Oh, et c'est une propriété attachée, non un comportement. Le nom de la classe est trompeur ici.Comme l'a dit Simon, c'est le ScrollViewer dans la ListBox modèle de la capture de l'événement. Pour contourner cela, vous pouvez fournir votre propre modèle.
Et la mise en œuvre de NoWheelScrollViewer est assez simple.
Ensuite, chaque fois que vous voulez une listbox de ne pas manipuler la molette de la souris.
Une solution simple qui a fonctionné pour moi est de remplacer le contrôle interne modèle pour supprimer le défilement de l'afficheur (selon le besoin) comme ce
Par exemple
J'ai une structure comme ceci
ListView (a)
ListView (b)
Je voulais bulle de la molette de défilement de (b) à (a), a cependant voulu garder la molette de défilement de (c).
J'ai simplement remplacé le Modèle de (b), comme cela. Cela m'a permis de bulle contenu de (b) à l'exception de (c) à (un). Aussi, je peux encore faire défiler le contenu de (c). Si je veux enlever même pour (c) et ensuite je dois refaire la même étape.
J'ai essayé d'adapter Simon Renard de réponse pour un contrôle DataGrid. J'ai trouvé le modèle caché mes en-têtes, et je n'ai jamais eu le mouseLeave de l'événement par le faire en C#. C'est finalement ce qui a fonctionné pour moi:
Une modification de Simon Renard de la solution si l'original ne fonctionne pas:
Vous devez écouter PreviewMouseWheel de ScrollViewer (ça fonctionne), mais pas de zone de liste.