C# 我是否可以在代码隐藏中判断弹出窗口是否已相对于其放置目标移动?

C# 我是否可以在代码隐藏中判断弹出窗口是否已相对于其放置目标移动?,c#,wpf,popup,position,C#,Wpf,Popup,Position,我正在进行一个WPF项目,在这个项目中,我有一个网格缩略图(每个缩略图都是一个SurfaceButton),单击每个缩略图会显示它自己的弹出菜单。在每种情况下,弹出菜单都有其“兄弟”照片缩略图作为其放置目标。缩略图和弹出窗口在网格中并排放置 我设计的弹出窗口模拟了iOS中的弹出式可滚动菜单,带有一个小三角形箭头,指向与弹出窗口相关的缩略图(弹出窗口显示在缩略图下方) 但是,让我惊喜的是,如果你点击屏幕底部的缩略图,WPF会将弹出窗口移到缩略图上方,这样它就不会离开屏幕 这很好,但是我如何比较这两

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

我设计的弹出窗口模拟了iOS中的弹出式可滚动菜单,带有一个小三角形箭头,指向与弹出窗口相关的缩略图(弹出窗口显示在缩略图下方)

但是,让我惊喜的是,如果你点击屏幕底部的缩略图,WPF会将弹出窗口移到缩略图上方,这样它就不会离开屏幕

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

希望这有点道理

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


我肯定有一个简单的解决方案,我错过了

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

// 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;
    }
};
Popup没有自己的大小或位置,因此只有在显示Popup时,您才能捕捉孩子的位置。

非常详细地解释了弹出窗口的放置方式,包括当弹出窗口的一部分离开屏幕时如何定位。但我认为这并不能回答你的问题。但是,应该有一种方法(类似于您尝试过的方法)来获取缩略图和弹出窗口的屏幕位置。也许把你试过的密码贴出来?谢谢保罗。已经读过了!我中断了显示弹出窗口的click事件,并在移动弹出窗口之前和之后检查了以下内容,并且这些值始终相对相同(即缩略图和弹出窗口之间的差异):VisualTreeHelper.GetOffset(元素),element.PointToScreen(新点(0,0)),element.PointFromScreen(新点(0,0))。我还希望弹出窗口的属性会改变,但它们保持不变:Placement、PlacementTarget、HorizontalOffset、VerticalOffset。可能是因为它在调用该方法之前没有移动?也许您可以尝试在弹出窗口的VisibilityChanged、Open或LayoutUpdate事件期间绘制三角形?在这些事件中,它可能具有正确的位置。我尝试了,并且我能够在打开的事件期间使用popup.PointToScreen(新点(0,0))获取弹出屏幕位置。您的弹出位置是什么?我已经试过了,但是按钮和弹出窗口的距离总是在1像素以内。