2009-06-10 3 views
3

J'écris un XBAP avec un Popup complexe (Canvas Z-index de 99 avec une grille dessus ...) que je voudrais "attacher" au bouton l'ouvre et suit ce bouton partout où il va sur l'écran. Par exemple, si le bouton est dans un ListBox ou un XamDataGrid je voudrais que le popup suive le bouton pendant qu'il défile. Si elle est en dessous d'un Expander, je veux qu'elle reste attachée au bouton quand l'expandeur l'oblige à bouger, etc.Relier un Popup à la position d'écran relative d'un autre contrôle

Des idées?

Répondre

0

Je ne suis pas sûr s'il mettra à jour automatiquement pour vous ou pas, mais la propriété PlacementTarget vous permet de spécifier un contrôle pour positionner le popup par rapport à. Si cela ne fonctionne pas, alors peut-être CustomPopupPlacementCallback fera l'affaire?

7

Lors de l'utilisation d'un Popup, ni PlacementTarget ni CustomPopupPlacementCallback est utilisé après le popup est apparu à l'origine. Ainsi, toute utilisation de ces propriétés ne permettra pas au popup de suivre le bouton au fur et à mesure qu'il se déplace.

Plusieurs façons me viennent de réaliser ce que vous désirez:

  1. Fixer une coutume Adorner sur le bouton et mettre la fenêtre à l'intérieur. Inconvénient: Popup n'est pas connecté à Button ou aux éléments environnants, il n'hérite donc pas des propriétés & DataContext d'eux.

  2. Attachez un Adorner personnalisé au bouton. Cet adorateur recevra des mesures et organisera les appels lorsque le bouton se déplace par rapport au AdornerLayer, ce qui vous permet de mettre à jour manuellement la position Popup. Tant que votre AdornerDecorator ne bouge pas par rapport à votre Window (par exemple s'il est l'enfant direct de la fenêtre), vous pouvez facilement détecter le AdornerLayer déplacé en surveillant les changements de taille de la fenêtre. Inconvénient: complexe au code & aller droit.

  3. Ne pas utiliser du tout Popup. Au lieu d'envelopper le bouton dans un <Grid> à côté d'un <Canvas> avec zéro largeur et la hauteur et la position désirée. A l'intérieur du <Canvas>, ajoutez le UserControl pour le popup avec un ZIndex approprié. Il s'étendra au-delà du bord du Canvas, ce qui est très bien dans WPF. Au lieu d'utiliser un contrôle Popup, il suffit de contrôler la visibilité du UserControl. Inconvénient: ne sera pas vraiment au-dessus de tous les autres objets, ne peut pas dépasser le bord de la fenêtre (peut-être pas un problème pour XBAP, cependant).

Questions connexes