获得弹出窗口的实际放置

时间:2014-12-22 19:32:52

标签: xaml windows-runtime

当触发特定用户输入时,我有一个弹出窗口出现在光标附近。

根据the docsFlyout.Placement属性仅是首选项,并不一定反映弹出窗口的位置。

我希望框架调用GetFlyoutPlacement来确定实际展示位置。我想知道实际位置是什么,这样我就可以添加一个指向光标位置的小箭头,如下所示:

popup with pointer

我唯一的选择是自己拨打GetFlyoutPlacement(在Flyout.Opening事件中触发),还是有更方便的方法来执行此操作?

2 个答案:

答案 0 :(得分:0)

我对GetFlyoutPlacementGetFlyoutPlacementTargetInfo的调用导致了Error HRESULT E_FAIL has been returned from a call to a COM component.,这并没有让我留下太多信息,所以我最终实现了我想象的那些背后的逻辑功能:

public static FlyoutPlacementMode GetActualFlyoutPlacement(
    Rect placementTarget,
    Size flyoutSize,
    FlyoutPlacementMode preferredPlacement )
{
    Rect ViewArea = Window.Current.Bounds;
    ViewArea.X = 0; // may have non-zero offset for multi-monitor setups
    ViewArea.Y = 0; // but we are only interested in offset relative to app view area

    switch (preferredPlacement)
    {
        case FlyoutPlacementMode.Right:
            if (desiredSize.Width < ViewArea.Width - placementTarget.Right) return FlyoutPlacementMode.Right;
            if (desiredSize.Width < placementTarget.Left) return FlyoutPlacementMode.Left;
            if (desiredSize.Height < placementTarget.Top) return FlyoutPlacementMode.Top;
            return FlyoutPlacementMode.Bottom;
        case FlyoutPlacementMode.Left:
            ...
    }
}

答案 1 :(得分:0)

查看我建议的方法here。我相信它更好,因为它不是猜测内部放置算法,而只是比较弹出窗口和目标元素的绝对坐标。