我正在编写一个带有复杂弹出窗口(Canvas Z-index 为 99,上面有一个网格......)的 XBAP,我想将它“附加”到打开它的按钮上,然后在它出现的任何地方跟随该按钮屏幕。例如,如果按钮位于 ListBox 或 XamDataGrid 中,我希望弹出窗口在按钮滚动时跟随按钮。如果它在扩展器下方,我希望它在扩展器强制它移动时保持连接到按钮,等等。
有任何想法吗?
使用 a时,在弹出窗口最初出现后Popup
既不使用PlacementTarget
也不使用。CustomPopupPlacementCallback
因此,对这些属性的任何使用都不允许弹出窗口在移动时跟踪按钮。
我想到了几种实现你想要的方法:
将自定义附加Adorner
到按钮并将弹出窗口放入其中。缺点:Popup 未连接到 Button 或周围元素,因此不会从它们继承属性和 DataContext。
将自定义附加Adorner
到按钮。当按钮相对于 移动时,此装饰器将获取测量和排列调用AdornerLayer
,允许您手动更新Popup
位置。只要您AdornerDecorator
不相对于您移动Window
(例如,如果它是 Window 的直接子级),您就可以AdornerLayer
通过监视 Window 大小的更改轻松检测到正在移动。缺点:编码复杂且正确。
根本不要使用 a Popup
。而是将按钮包装在宽度和高度为零以及所需位置的 a<Grid>
旁边。<Canvas>
在弹出窗口中<Canvas>
添加UserControl
适当的 ZIndex。它将延伸超出画布的边缘,这在 WPF 中很好。而不是使用Popup
控件,只需控制UserControl
. 缺点:不会真正完全在所有其他对象之上,不能延伸到窗口边缘(但可能不是 XBAP 的问题)。
我不确定它是否会为您自动更新,但PlacementTarget属性允许您指定一个控件以相对于定位弹出窗口。如果这不起作用,那么也许CustomPopupPlacementCallback可以解决问题?