如果相对于其放置目标移动了一个弹出窗口,我可以告诉代码隐藏吗?

时间:2012-02-07 16:21:44

标签: c# wpf popup position

我正在开发一个WPF项目,我有一个缩略图网格(每个缩略图是一个SurfaceButton),点击每个缩略图显示它自己的弹出菜单。每种情况下的弹出菜单都有其“兄弟”照片缩略图作为其放置目标。缩略图和弹出窗口在网格中并排放置。

我设计了弹出窗口来模拟你在iOS中找到的popout可滚动菜单,带有一个小三角箭头,指向弹出窗口相关的缩略图(弹出窗口出现在缩略图下面)

但是,令我惊喜的是,如果您点击屏幕底部的缩略图,WPF会将缩略图移动到缩略图上方,这样它就不会出现在屏幕外。

这很棒,但是如何比较两个元素的位置并相应地移动箭头(或隐藏它并显示另一个),以便缩略图上方的弹出窗口指向它?

希望有道理!

我尝试过VisualTreeHelper.GetOffset,但只返回元素父级的偏移量,这些似乎总是0,0或1,1。我也尝试过UIElement.PointToScreen,但是当弹出窗口移动时,我从这两个元素返回的数字似乎并没有变化。

我确信有一个我想念的简单解决方案。

1 个答案:

答案 0 :(得分:0)

您可以获得弹出窗口的实际展示位置,如下所示

// ComboBox for example:
Popup popup = yourcombobox.Template.FindName("PART_Popup", yourcombobox) as Popup;

popup.Opened += (s, a) => {
    // structure inside will be different by your templates
    Dacorator decorator = (s as popup).Child as Decorator;
    Border border = decorator.Child as Border;
    Double y0 = yourcombobox.PointToScreen(new Point(0,0)).Y;
    Double y1 = border.PointToScreen(new Point(0,0)).Y;
    if(y0 > y1) {
        // when shows at the top
        yourcombobox.Background = Brushes.Red;
    } else {
        // when shows at the botttom
        yourcombobox.Background = Brushes.Blue;
    }
};

弹出窗口没有自己的大小或位置,所以只有在显示弹出窗口时才必须抓住孩子的位置。 https://docs.microsoft.com/en-us/dotnet/framework/wpf/controls/popup-overview