10
votes

WPF détecte le contrôle des parents de défilement

Imaginez la situation que vous ouvrez un document WPF PopUp (E.G. Par ButtonClick ). Vous avez une liste listbox directement dans le document popup avec des éléments, vous devez donc être capable de faire défiler. Imaginez que ceci est votre contrôle personnalisé et il est situé dans le ScrollViewer .

Maintenant, si vous vous déplacez avec votre souris à l'extérieur de la fenêtre surface surface et faites défiler, que se passe-t-il? Vous faites défiler de haut en bas, mais avec le popup ouvert! Et c'est le problème.

La question est de savoir comment détecter de l'intérieur du contrôle, que certains autres contrôles parent inconnus dans Visualtree ont commencé à faire défiler? et définir consécutivement isdropdownopen = false ?


1 commentaires

J'ai la même question et la même question. Je fais défiler ma grille et ma popup avec des opérations personnalisées restez au même endroit! J'ai besoin de faire défiler la popup avec la grille!


3 Réponses :


1
votes

Je ne contestez pas comment vos commandes sont, mais ne pouvez-vous pas baser votre ouverture / fermeture d'un contrôle sur l'événement de mise au point? Et si cela perd la mise au point, fermer la popup? Peut-être que je comprends mal, pouvez-vous poster un extrait de code? Daniel


0 commentaires

11
votes

Nous pouvons écrire une gâchette à utiliser avec des éléments contenus dans un ScrollViewer code>. Voici un exemple complet Application: xxx pré>

Nous avons un bouton qui ouvre un popup code> et tout défilement dans n'importe quel parent ScrollViewer code> provoque le ScrollTrigger CODE> Actions à tirer et ensuite nous pouvons fermer la popup. Notez que la gâchette est attachée à la touche code> code> et non de la popup code>. Nous pouvons utiliser n'importe quel élément à proximité dans l'arbre visuel. Notez également que nous utilisons un autre déclencheur pour ouvrir le popup code> mais comment il s'ouvre n'est pas important pour la question initiale. P>

Voici le ScrollTrigger code>:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"


0 commentaires

0
votes

AVERTISSEMENT: Il s'agit d'un long commentaire, et il est essentiellement expliquer mes modifications à @ Rick Sladkey '' s réponse. Ce fut un excellent point de départ, mais j'ai remarqué quelques changements que j'ai faits avec certaines choses que j'ai constatés sur des choses qui me passivais.

En faisant mes contrôles personnalisés, je voulais quelque chose de similaire à ceci (je voulais fermer une popup sur un rouleau de défilement ), et a trouvé la réponse à être quelque chose de très similaire à celle de la réponse de Rick Sladkey avec quelques modifications mineures pour aider à améliorer certains articles.

Les modifications que j'ai faites étaient principalement en ce qui concerne 3 éléments. Le premier étant que je voyais que le ScrollViewer_scrollCollchanged a été tiré lorsque je ne faisais pas défiler activement (d'autres les autres le fixent apparemment). Ensuite, lorsque je déchargeais mes commandes, ScrollViewer_scrollchanged n'a pas été détaché à partir du ScrollViewer s, donc si j'ai ajouté 3 puis supprimé 1 et défilé, il tirait toujours le feu 3 fois au lieu de 2. Enfin, je voulais pouvoir ajouter la fonctionnalité de permettre au consommateur de mon contrôle de définir la propriété isopen de manière dynamique.

avec cela, ma version modifiée du ScrollTrigger La classe ressemble à quelque chose comme: xxx

Le premier changement ici est que j'ai ajouté la logique dans ScrollViewer_scrollchanged pour voir si les valeurs de décalage effectivement changé ou non. J'ai ajouté une propriété de dépendance sur la gâchette pour vous permettre de contourner cette logique si vous le souhaitez. Le deuxième changement que j'ai ajouté un événement non chargé à l'objet associé, de sorte que si le contrôle a été supprimé, il supprimerait les actions connexes dans le ScrollViewers , réduisant la quantité de fois que le ScrollViewer_scrollchanged < / Code> L'appel a été effectué lors de l'ajout et de la suppression de mes commandes de manière dynamique.

Avec ces changements d'esprit et le fait que je souhaite pouvoir permettre aux consommateurs de mon contrôle de dicter la manière dont la popup est affichée, mon .xaml a regardé quelque chose comme: xxx

Maintenant, j'avais besoin de quelque chose à lier à, et parce que je crée un contrôle personnalisé, j'ai créé des propriétés de dépendance et d'autres éléments du code-derrière. Si vous utilisez cette approche avec MVVM, vous souhaitez écrire ' inotifyProperty et assurez-vous que vos liaisons sont des éléments (pourraient ne pas avoir besoin des parties d'élémentsName de la liaison en fonction de la façon dont vous le faites). Il existe de nombreuses façons de faire cela, et si vous ne le savez pas, il suffit de Google "Données MVVM inotifypropertychangned" et vous le trouverez facilement.

Note latérale, j'utilise également prisme, J'utilise donc déléguecommand s, mais vous pouvez utiliser n'importe quelle implémentation de iCommand souhaité. Avec cela, mon code-derrière ressemblait à quelque chose comme: xxx

et avec cela, je suis capable d'avoir une pop up qui fermera sur n'importe quel déclencheur de défilement qui a réellement un changement, ne dispose pas d'appels non requis et permettra également à un utilisateur de modifier s'il est ouvert ou non.

Si vous l'avez fait aussi loin, merci. J'apprécie votre dévouement et j'espère que cela aide un peu.


0 commentaires