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:
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.
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.
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).