3

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

有任何想法吗?

4

2 回答 2

7

使用 a时,在弹出窗口最初出现后Popup既不使用PlacementTarget也不使用。CustomPopupPlacementCallback因此,对这些属性的任何使用都不允许弹出窗口在移动时跟踪按钮。

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

  1. 将自定义附加Adorner到按钮并将弹出窗口放入其中。缺点:Popup 未连接到 Button 或周围元素,因此不会从它们继承属性和 DataContext。

  2. 将自定义附加Adorner到按钮。当按钮相对于 移动时,此装饰器将获取测量和排列调用AdornerLayer,允许您手动更新Popup位置。只要您AdornerDecorator不相对于您移动Window(例如,如果它是 Window 的直接子级),您就可以AdornerLayer通过监视 Window 大小的更改轻松检测到正在移动。缺点:编码复杂且正确。

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

于 2010-01-21T09:12:16.330 回答
0

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

于 2009-06-10T21:27:17.553 回答