【问题标题】:Determining which CustomPopupPlacement was used for WPF Popup确定用于 WPF 弹出窗口的 CustomPopupPlacement
【发布时间】:2013-02-27 11:02:09
【问题描述】:

我试图找出在弹出窗口实际呈现时使用了传入的CustomPopupPlacement 位置数组中的哪一个。有什么事件可以检测到这一点吗?

这个 2009 年的 msdn 线程似乎正是我的问题,但似乎没有答案。

http://social.msdn.microsoft.com/Forums/da/wpf/thread/4c6d216a-0011-4202-aa7e-2fccef3cc355

标记的答案似乎无效,我的情况与线程中的 OP 完全相同。

我将弹出带有 4 条路径的弹出窗口,并使用 DP 切换三个路径的可见性,以选择要渲染的正确箭头路径。

因此,鉴于我们通过CustomPopupPlacementCallbackdelegate 提供了 4 个放置选项,有没有办法检测系统在处理屏幕边缘情况和排序后最终选择的 4 个位置中的哪一个。

【问题讨论】:

    标签: c# wpf xaml popup


    【解决方案1】:

    找到弹出窗口位置的更好方法。 此方法需要存在 Child 元素,但考虑到 Popup 元素附带的 Grid,这没有问题。

        UIElement container = VisualTreeHelper.GetParent(this) as UIElement;
        Point relativeLocation = this.Child.TranslatePoint(new Point(0, 0), container); //It HAS(!!!) to be this.Child
    
        if (relativeLocation.Y < 0) //or use X for left and right
        {
            Console.WriteLine("TOP PLACEMENT!");
        }
        else
        {
            Console.WriteLine("BOTTOM PLACEMENT!");
        }
    

    【讨论】:

    • 注意:此代码仅在弹出窗口已完成打开后才有效(即 popup.IsOpen 触发器不起作用)。
    【解决方案2】:

    我有一个小技巧。 将自定义点保存为派生的 TooTip 类中的字段并覆盖 OnOpened 方法。

    protected override void OnOpened(RoutedEventArgs e)
    {
        base.OnOpened(e);
        var p = this.TranslatePoint(new Point(0, 0), this.PlacementTarget);
        var diff1 = this.first - p;
        var diff2 = this.second - p;
    
        if (Math.Abs(Math.Min(diff1.Length, diff2.Length) - diff1.Length) < 0.01)
        {
            // First Point
        }
        else
        {
            // Second Point
        }
    }
    

    欢迎提供更好的解决方案

    【讨论】:

    • 为回复干杯。我会将此标记为答案,尽管我们现在已从我们的应用程序中删除了此要求。
    猜你喜欢
    • 2012-07-15
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 2011-09-04
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多