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