将Popup绑定到另一个控件的相对屏幕位置

时间:2009-06-10 21:14:30

标签: wpf popup screen position xbap

我正在编写一个带有复杂Popup的XBAP(Canvas Z-index为99,其上有一个网格...),我想“附加”到打开它的按钮,并按下该按钮环绕任何地方进入屏幕。例如,如果按钮位于ListBox或XamDataGrid中,我希望弹出按钮在滚动时跟随按钮。如果它位于扩展器下方,我希望它在扩展器强制移动时保持与按钮的连接等。

任何想法?

2 个答案:

答案 0 :(得分:7)

使用Popup时,弹出窗口最初出现后,PlacementTargetCustomPopupPlacementCallback都不会被使用。因此,任何使用这些属性都不允许弹出窗口在移动时跟踪按钮。

我实现了你想要的几种方式:

  1. 将自定义Adorner附加到按钮并将弹出窗口放入其中。缺点:弹出窗口没有连接到Button或周围的元素,所以它不会继承属性和&来自他们的DataContext。

  2. 将自定义Adorner附加到按钮。当按钮相对于AdornerLayer移动时,此装饰器将进行测量并安排呼叫,允许您手动更新Popup位置。只要您的AdornerDecorator不会相对于Window移动(例如,如果它是窗口的直接子项),您就可以通过监视更改来轻松检测到移动的AdornerLayer窗口大小。缺点:复杂的代码和走吧。

  3. 根本不要使用Popup。而是将按钮放在<Grid>旁边的<Canvas>旁边,零宽度和高度以及所需的位置。在<Canvas>内为弹出窗口添加UserControl并使用适当的ZIndex。它将延伸超过Canvas的边缘,这在WPF中很好。而不是使用Popup控件只是控制UserControl的可见性。缺点:不会完全在所有其他对象之上,不能延伸到窗口的边缘(尽管可能不是XBAP的问题)。

答案 1 :(得分:0)

我不确定它是否会为您自动更新,但PlacementTarget属性允许您指定一个控件来定位弹出窗口相对于。如果这不起作用,那么也许CustomPopupPlacementCallback可以解决这个问题吗?

相关问题