将一个弹出窗口绑定到另一个控件的相对屏幕位置上。

16 浏览
0 Comments

将一个弹出窗口绑定到另一个控件的相对屏幕位置上。

我正在编写一个具有复杂弹出窗口的XBAP应用程序(Canvas Z-index为99,上面有一个网格...),我想要将其“附加”到打开它的按钮,并在屏幕上随着按钮的移动而移动。例如,如果按钮在一个ListBox或XamDataGrid中,我希望弹出窗口在滚动时跟随按钮移动。如果它在一个Expander下面,我希望当Expander强制移动时仍然与按钮保持连接,等等。

有什么想法吗?

0
0 Comments

当使用Popup时,一旦弹出窗口出现后,就不再使用PlacementTargetCustomPopupPlacementCallback。因此,使用这些属性将无法使弹出窗口跟踪按钮的移动。

有几种方法可以实现您的需求:

  1. 将自定义Adorner附加到按钮上,并将弹出窗口放在其中。缺点:弹出窗口与按钮或周围元素没有连接,因此它不会从它们那里继承属性和数据上下文。
  2. 将自定义Adorner附加到按钮上。当按钮相对于AdornerLayer移动时,该装饰器将收到测量和排列调用,从而允许您手动更新Popup的位置。只要您的AdornerDecorator不相对于Window移动(例如,如果它是Window的直接子元素),您可以通过监视窗口大小的更改来轻松检测到AdornerLayer的移动。缺点:编码复杂,需要正确实现。
  3. 根本不使用Popup。而是将按钮包装在一个<Grid>中,旁边是一个宽度和高度都为零的<Canvas>,以及所需的位置。在<Canvas>内部,添加用于弹出窗口的UserControl,并设置适当的ZIndex。它将超出Canvas的边缘,这在WPF中是可以的。不使用Popup控件,只需控制UserControl的可见性。缺点:可能不会真正完全覆盖其他所有对象,不能扩展到窗口边缘(但对于XBAP可能不是问题)。
0
0 Comments

问题出现的原因:希望将一个弹出窗口(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”问题的原因和解决方法。

0