问题
I'm writing an XBAP with a complex Popup (Canvas Z-index of 99 with a grid on it...) that I would like to "attach" to the button that opens it and follow that button around wherever it goes on the screen. For example, if the button is in a ListBox or an XamDataGrid I would like the popup to follow the button as it scrolls through. If it is beneath an Expander I want it to stay attached to the button when the expander forces it to move, etc.
Any Ideas?
回答1:
When using a Popup
, neither PlacementTarget
nor CustomPopupPlacementCallback
is used after the popup has originally appeared. So any use of these properties will not allow the popup to track the button as it moves.
Several ways occur to me of achieving what you desire:
Attach a custom
Adorner
to the button and put the popup inside it. Disadvantage: Popup is not connected to Button or surrounding elements, so it won't inherit properties & DataContext from them.Attach a custom
Adorner
to the button. This adorner will get measure and arrange calls when the button moves relative to theAdornerLayer
, allowing you to manually update thePopup
position. As long as yourAdornerDecorator
doesn't move relative to yourWindow
(eg if it is the direct child of the Window), you can easily detect theAdornerLayer
being moved by monitoring changes to Window size. Disadvantage: Complex to code & get right.Don't use a
Popup
at all. Instead wrap the button in a<Grid>
alongside a<Canvas>
with zero width and height and the desired position. Inside the<Canvas>
add theUserControl
for the popup with an appropriate ZIndex. It will extend past the edge f the Canvas, which is just fine in WPF. Instead of using aPopup
control just control the visibility of theUserControl
. Disadvantage: Will not really be totally on top of all other objects, can't extend off edge of window (may not be an issue for XBAP, though).
回答2:
I'm not sure if it will auto-update for you or not, but the PlacementTarget property allows you to specify a control to position the popup relative to. If that doesn't work, then maybe CustomPopupPlacementCallback will do the trick?
来源:https://stackoverflow.com/questions/978186/binding-a-popup-to-another-controls-relative-screen-position