我正在编写一个带有复杂弹出窗口的 XBAP(Canvas Z-index 为 99,上面有一个网格...)出现在屏幕上。例如,如果按钮位于 ListBox 或 XamDataGrid 中,我希望弹出窗口在按钮滚动时跟随按钮。如果它在 Expander 下方,我希望它在 Expander 迫使它移动时保持与按钮的连接,等等。
有什么想法吗?
最佳答案
使用 Popup
时, 既不PlacementTarget
也不CustomPopupPlacementCallback
在弹出窗口最初出现后使用。因此,对这些属性的任何使用都不允许弹出窗口在按钮移动时对其进行跟踪。
我想到了几种方法来实现您的愿望:
附加自定义
Adorner
到按钮并将弹出窗口放入其中。缺点:Popup 没有连接到 Button 或周围的元素,因此它不会从它们继承属性和 DataContext。附加自定义
Adorner
到按钮。当按钮相对于AdornerLayer
移动时,此装饰器将获得测量和排列调用,允许您手动更新Popup
位置。只要你的AdornerDecorator
不会相对于您的Window
移动(例如,如果它是 Window 的直接子级),您可以轻松检测到AdornerLayer
通过监 window 口大小的变化而移动。缺点:编码复杂且正确。不要使用
Popup
根本。而是将按钮包裹在<Grid>
中在<Canvas>
旁边具有零宽度和高度以及所需的位置。<Canvas>
里面添加UserControl
为具有适当 ZIndex 的弹出窗口。它将延伸超过 Canvas 的边缘,这在 WPF 中很好。而不是使用Popup
控制只是控制UserControl
的可见性.缺点:不会真正完全位于所有其他对象之上,不能超出窗口边缘(不过对于 XBAP 来说可能不是问题)。
关于wpf - 将 Popup 绑定(bind)到另一个控件的相对屏幕位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/978186/