我正在开发一个WPF项目,我有一个缩略图网格(每个缩略图是一个SurfaceButton),点击每个缩略图显示它自己的弹出菜单。每种情况下的弹出菜单都有其“兄弟”照片缩略图作为其放置目标。缩略图和弹出窗口在网格中并排放置。
我设计了弹出窗口来模拟你在iOS中找到的popout可滚动菜单,带有一个小三角箭头,指向弹出窗口相关的缩略图(弹出窗口出现在缩略图下面)
但是,令我惊喜的是,如果您点击屏幕底部的缩略图,WPF会将缩略图移动到缩略图上方,这样它就不会出现在屏幕外。
这很棒,但是如何比较两个元素的位置并相应地移动箭头(或隐藏它并显示另一个),以便缩略图上方的弹出窗口指向它?
希望有道理!
我尝试过VisualTreeHelper.GetOffset,但只返回元素父级的偏移量,这些似乎总是0,0或1,1。我也尝试过UIElement.PointToScreen,但是当弹出窗口移动时,我从这两个元素返回的数字似乎并没有变化。
我确信有一个我想念的简单解决方案。
答案 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