private static void PositionPopup(Windows.Popup popup)
{
var parent = popup.Parent as FrameworkElement;
var placementParent = GetPlacementParent(popup) ?? popup.Parent as FrameworkElement;
var placementChild = GetPlacementChild(popup) ?? popup.Child as FrameworkElement;
if (parent == null || placementParent == null || placementChild == null)
{
return;
}
var preferredOrientations = GetPreferredOrientations(popup) ?? Enumerable.Empty<PopupOrientation>();
foreach (var preferredOrientation in preferredOrientations)
{
if (TryPlacePopup(popup, parent, placementParent, placementChild, preferredOrientation))
{
return;
}
}
var fallbackOrientations = from placement in popupPlacements
from horizontalAlignment in horizontalAlignments
from verticalAlignment in verticalAlignments
where preferredOrientations.FirstOrDefault(x => x.Placement == placement && x.HorizontalAlignment == horizontalAlignment && x.VerticalAlignment == verticalAlignment) == null
select new PopupOrientation() { Placement = placement, HorizontalAlignment = horizontalAlignment, VerticalAlignment = verticalAlignment };
foreach (var fallbackOrientation in fallbackOrientations)
{
if (TryPlacePopup(popup, parent, placementParent, placementChild, fallbackOrientation))
{
return;
}
}
// give up and just use the first preferred orientation, if any
var orientation = GetPreferredOrientations(popup).FirstOrDefault();
if (orientation != null)
{
SetActualOrientation(popup, orientation);
}
}