将一个弹出窗口绑定到另一个控件的相对屏幕位置上。
当使用Popup
时,一旦弹出窗口出现后,就不再使用PlacementTarget
或CustomPopupPlacementCallback
。因此,使用这些属性将无法使弹出窗口跟踪按钮的移动。
有几种方法可以实现您的需求:
- 将自定义
Adorner
附加到按钮上,并将弹出窗口放在其中。缺点:弹出窗口与按钮或周围元素没有连接,因此它不会从它们那里继承属性和数据上下文。 - 将自定义
Adorner
附加到按钮上。当按钮相对于AdornerLayer
移动时,该装饰器将收到测量和排列调用,从而允许您手动更新Popup
的位置。只要您的AdornerDecorator
不相对于Window
移动(例如,如果它是Window的直接子元素),您可以通过监视窗口大小的更改来轻松检测到AdornerLayer
的移动。缺点:编码复杂,需要正确实现。 - 根本不使用
Popup
。而是将按钮包装在一个<Grid>
中,旁边是一个宽度和高度都为零的<Canvas>
,以及所需的位置。在<Canvas>
内部,添加用于弹出窗口的UserControl
,并设置适当的ZIndex。它将超出Canvas
的边缘,这在WPF中是可以的。不使用Popup
控件,只需控制UserControl
的可见性。缺点:可能不会真正完全覆盖其他所有对象,不能扩展到窗口边缘(但对于XBAP可能不是问题)。
问题出现的原因:希望将一个弹出窗口(Popup)绑定到另一个控件的相对屏幕位置,但不确定如何实现。
解决方法:使用PlacementTarget属性来指定相对于的控件来定位弹出窗口。如果PlacementTarget属性不能满足需求,可以尝试使用CustomPopupPlacementCallback属性来自定义弹出窗口的位置。
代码示例:
// 使用PlacementTarget属性定位弹出窗口 Popup myPopup = new Popup(); myPopup.PlacementTarget = myControl; // 使用CustomPopupPlacementCallback属性自定义弹出窗口位置 Popup myPopup = new Popup(); myPopup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(CustomPlacementMethod);
以上就是解决“Binding a Popup to another control's relative screen position”问题的原因和解决方法。